-
2022-03-11 16:13:37
三阶行列式由三行三列九个元素组成,我们定义为a11、a12、a13、a21、a22、a23、a31、a32、a33。
其中a11、a12、a13表示第一行的三个数字(元素)
a21、a22、a23表示第二行的三个数字(元素)
a31、a32、a33表示第三行的三个数字(元素)。
这个三阶行列式的值定义为D。
三阶行列式的求值公式a11*a22*a33+a12*a23*a31+a13*a21*a32-a13*a22*a31-a12*a21*a33-a11*a23*a32。
运行程序时输入的数字之间要使用逗号间隔开。
#include"stdio.h" int main() { int a11,a12,a13,a21,a22,a23,a31,a32,a33,D; scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,\n",&a11,&a12,&a13,&a21,&a22,&a23,&a31,&a32,&a33); printf("D=%d\n",a11*a22*a33+a12*a23*a31+a13*a21*a32-a13*a22*a31-a12*a21*a33-a11*a23*a32); return 0; }
更多相关内容 -
有关循环矩阵的行列式计算及其应用 (2005年)
2021-05-11 06:55:14本文给出了循环矩阵的行列式的一种计算方法并得到许多有趣的结论。进一步得到了广义循环矩阵的行列式的计算公式。 -
行列式的计算(c++)——公式法(5阶)和递推法(n阶)
2021-09-05 11:39:55行列式的众多正经的不正经的计算方法就属线性代数的内容了,这里不过多讨论,主要介绍代码中会用到的两种: 公式计算 行列式值的计算公式为 ∣a11a12⋯a1na21a22⋯a2n⋮⋮⋯⋮an1an2⋯ann∣=∑p1p2⋯pn(−1)τ(p1p2...行列式的计算
行列式的众多正经的不正经的计算方法就属线性代数的内容了,这里不过多讨论,主要介绍代码中会用到的两种:
- 公式计算
行列式值的计算公式为
∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋯ ⋮ a n 1 a n 2 ⋯ a n n ∣ = ∑ p 1 p 2 ⋯ p n ( − 1 ) τ ( p 1 p 2 ⋯ p n ) a 1 p 1 a 2 p 2 ⋯ a n p n \left| \begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 n} \\ a_{21} & a_{22} & \cdots & a_{2 n} \\ \vdots & \vdots & \cdots & \vdots \\ a_{n 1} & a_{n 2} & \cdots & a_{n n} \end{array} \right| =\sum_{p_1p_{2} \cdots p_{n}}(-1)^{\tau\left(p_{1} p_{2} \cdots p_{n}\right)} a_{1 p_{1}} a_{2 p_{2}} \cdots a_{n p_{n}} ∣∣∣∣∣∣∣∣∣a11a21⋮an1a12a22⋮an2⋯⋯⋯⋯a1na2n⋮ann∣∣∣∣∣∣∣∣∣=p1p2⋯pn∑(−1)τ(p1p2⋯pn)a1p1a2p2⋯anpn
其中 τ \tau τ是序列 p 1 p 2 p 3 p 4 ⋯ p_1p_2p_3p_4\cdots p1p2p3p4⋯中的逆序对数且各 p i p_i pi互不相同。 - 利用代数余子式进行计算
结论:行列式等于它任意一行(列)的各元素与其对应的代数式余子式乘积之和。
∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ = a 11 ∣ a 22 a 23 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a n 2 a n 3 ⋯ a n n ∣ − a 12 ∣ a 22 a 23 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a n 2 a n 3 ⋯ a n n ∣ + ⋯ + ( − 1 ) 1 + n a 1 n ∣ a 21 a 22 ⋯ a 2 , n − 1 ⋮ ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n , n − 1 ∣ \begin{aligned} \left|\begin{array}{cccc} a_{11} & a_{12} & \cdots & a_{1 n} \\ a_{21} & a_{22} & \cdots & a_{2 n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n 1} & a_{n 2} & \cdots & a_{n n} \end{array}\right|=& a_{11}\left|\begin{array}{cccc} a_{22} & a_{23} & \cdots & a_{2 n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n 2} & a_{n 3} & \cdots & a_{n n} \end{array}\right|-a_{12}\left|\begin{array}{cccc} a_{22} & a_{23} & \cdots & a_{2 n} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n 2} & a_{n 3} & \cdots & a_{n n} \end{array}\right| +\cdots+(-1)^{1+n} a_{1 n}\left|\begin{array}{cccc} a_{21} & a_{22} & \cdots & a_{2, n-1} \\ \vdots & \vdots & \vdots & \vdots \\ a_{n 1} & a_{n 2} & \cdots & a_{n, n-1} \end{array}\right| \end{aligned} ∣∣∣∣∣∣∣∣∣a11a21⋮an1a12a22⋮an2⋯⋯⋮⋯a1na2n⋮ann∣∣∣∣∣∣∣∣∣=a11∣∣∣∣∣∣∣a22⋮an2a23⋮an3⋯⋮⋯a2n⋮ann∣∣∣∣∣∣∣−a12∣∣∣∣∣∣∣a22⋮an2a23⋮an3⋯⋮⋯a2n⋮ann∣∣∣∣∣∣∣+⋯+(−1)1+na1n∣∣∣∣∣∣∣a21⋮an1a22⋮an2⋯⋮⋯a2,n−1⋮an,n−1∣∣∣∣∣∣∣
1. 5阶矩阵行列式的计算
∣ a 00 a 01 a 02 a 03 a 04 a 10 a 11 a 12 a 13 a 14 a 20 a 21 a 22 a 23 a 24 a 30 a 31 a 32 a 33 a 34 a 40 a 41 a 42 a 43 a 44 ∣ = ∑ j 0 j 1 j 2 j 3 j 4 ( − 1 ) τ ( j 0 j 1 j 2 j 3 j 4 ) a 0 j 0 a 1 j 1 a 2 j 2 a 3 j 3 a 4 j 4 \left| \begin{array}{cccc} a_{00}&a_{01} & a_{02} & a_{03}&a_{04} \\ a_{10}&a_{11} & a_{12} & a_{13}&a_{14} \\ a_{20}&a_{21} & a_{22} & a_{23}&a_{24}\\ a_{30}&a_{31} & a_{32} & a_{33}&a_{34}\\ a_{40}&a_{41} & a_{42} & a_{43}&a_{44} \\ \end{array} \right| =\sum_{j_0j_1j_2j_3j_4 }(-1)^{\tau\left(j_0j_1j_2j_3j_4 \right)} a_{0 j_{0}} a_{1j_1} a_{2j_2}a_{3j_3}a_{4j_4} ∣∣∣∣∣∣∣∣∣∣a00a10a20a30a40a01a11a21a31a41a02a12a22a32a42a03a13a23a33a43a04a14a24a34a44∣∣∣∣∣∣∣∣∣∣=j0j1j2j3j4∑(−1)τ(j0j1j2j3j4)a0j0a1j1a2j2a3j3a4j4
C++代码实现#include<iostream> #include<string> using namespace std; int main() { double a[5][5] = { 0 }; double result = 0; int j0, j1, j2, j3, j4, inverse, flag; //输入矩阵 cout << "请输入矩阵的25个数据:"; for (int i = 0; i < 5; ++i) for (int j = 0; j < 5; ++j) cin >> a[i][j]; for (j0 = 0; j0 < 4; ++j0){ inverse = 0; //逆序对初值 for (j1 = 0; j1 < 4; ++j1){ if (j1 == j0) continue; //排除j1和j0相等的情况 else if (j1 < j0) ++inverse;//若j1<j0,则逆序数+1 for (j2 = 0; j2 < 4; ++j2) { if (j2 == j0 || j2 == j1) continue; inverse += (j2 < j0) + (j2 < j1);//若j2<j0 则(j2<j0)的值为1;若j2>j0 则(j2<j0)的值为0 for (j3 = 0; j3 < 4; ++j3) { if (j3 == j2 || j3 == j1 || j3 == j0)continue; inverse += (j3 < j2) + (j3 < j1) + (j3 < j0); for (j4 = 0; j4 < 4; ++j4) if (j4 == j3 || j4 == j2 || j4 == j1 || j4 == j0) continue; //j4可以不利用枚举法 //j4 = 10 - j0 - j1 - j2 - j3; inverse += (j4 < j3) + (j4 < j2) + (j4 < j1) + (j4 < j0); flag = (inverse % 2 == 0 ? 1 : -1); result += flag * a[0][j0] * a[1][j1] * a[2][j2] * a[3][j3] * a[4][j4]; } } } } for (int m = 0; m < 5; ++m) { for (int n = 0; n < 5; ++n) cout << a[m][n] << " "; cout << endl; } cout << "行列式的值是" << result << endl; return 0; }
运行结果如下:
注:为了能够简单验证结果的正确性,所以取的矩阵比较“好看”。
2. n阶矩阵行列式的计算
对于n阶矩阵来说,由于并不能在编程时确定其矩阵大小,上述方法则显得不是那么恰当,在这里利用指针构造动态数组进行计算。
动态数组和普通数组的最大区别在于,它的规模可以是运行程序过程种某一变量的值或某一表达式的计算结果,而普通数组的长度必须是在编译时就能确定的常量。
注:动态数组不能为数组元素赋初值
C++代码实现
#include <stdio.h> #include <iostream> using namespace std; int det(int n, int** mat)//取矩阵的第一列进行运算 { int mov = 0;//记录a,b矩阵相对应的行数是否发生了改变 int flag; int sum = 0; if (n == 1) return mat[0][0]; int** b = new int* [n - 1];//创建第一列的n-1阶代数余子式矩阵 for (int z = 0; z < n-1; ++z) b[z] = new int[n-1];//为每一行申请空间 for (int i = 0; i < n; ++i) { for (int j = 0; j < n - 1; ++j) { mov = i > j ? 0 : 1; //b中行数小于此时a中所取行数即i时,可直接将a中j行搬到b中j行; //b中行数大于此时a中所取行数即i时,需将a中第j+1行搬运到b中j行; for (int k = 0; k < n - 1; ++k)//开始一行一行的搬运 b[j][k] = mat[j + mov][k + 1];//k+1是因为在搬运过程中不取mat中第一列 } if (i % 2 == 0) flag = 1; else flag = -1;//判断符号的正负,因为所取值为mat[0][i],所以需判断1+1+i=i+2的奇偶 sum += flag * mat[i][0] * det(n - 1, b); } delete[] b; return sum; } int main() { int n = 0;//矩阵阶数 cout << "输入矩阵阶数:" << endl; cin >> n; int** a = new int* [n];//所要求的矩阵,因为矩阵阶数不是常数,so不能直接创建数组,以指针的形式呈现。 for (int z = 0; z < n; ++z) a[z] = new int[n];//为每一行申请空间 cout << "输入矩阵:" << endl; for (int x = 0; x < n; ++x) for (int y = 0; y < n; ++y) cin >> a[x][y]; for (int x = 0; x < n; ++x) { cout << endl; for (int y = 0; y < n; ++y) cout << a[x][y] << " "; } cout << endl; cout << "矩阵行列式的值为:" << det(n, a); for (int p = 0; p < n; ++p) delete[] a[p]; delete[]a; return 0; }
灵感来源于:https://blog.csdn.net/sinat_36219858/article/details/54016698
这篇博文并未利用二级指针,而是利用数组储存了全部矩阵信息。运行结果如下:
注:为了能够简单验证结果的正确性,所以取的矩阵比较“好看”。当然,如果真的只是为了算个矩阵,仍旧强推MATLAB。
3. 踩坑记录
- 5阶矩阵的代码编写还是比较容易的,可以在此基础上进行改进,比如求个6阶,7阶也是可以的。
- n阶代码的确编了很长时间,可能是由于一学期不学线代+一学期不敲代码的原因,出了一些奇奇怪怪的错:
- 循环的位置一定要看对,语句一定要放在正确的循环里。
- 指针的基本操作要熟悉,要不不是忘了申请空间就是忘了释放空间
- 行列要分清,不然。。。像我一样把 m a t [ i ] [ 0 ] mat[i][0] mat[i][0]写成 m a t [ 0 ] [ i ] mat[0][i] mat[0][i]盯一下午?
- 顺便提醒一下,n阶的代码在VS上运行会报很多警告,大概是它跟多级2指针有仇,可以给大家看一眼:
so,最后看不下去,用的codeblocks:
距上一篇博客怕是已经半年了,这半年几乎没敲过代码(因为不上有关的课了)。下学期会学数据结构,so趁开学前几天把C++复习一下~
- 公式计算
-
c++行列式的计算(递归)
2022-03-26 11:50:47新书,递归,行列式。此处不在赘述行列式的数学求法。各位好友不会的还请自行补习。
知识点行列式的降阶计算 。
#include <iostream> #include <cstdlib> using namespace std; #define N 100 int D[N][N]; //用于储存行列式 int Deter(int a[][N], int u, int k) { if(u == 1) return a[0][0]; //如果为一阶行列式直接输出结果 if(u == 2) return a[0][0] * a[1][1] - a[0][1] * a[1][0];//二阶行列式直接输出结果 int ans = 0; for(int i = 1; i < u; ++i)//i代表循环的次数 { int line = 0, row = 0; int D_new[N][N]; //用于存放新的降阶后的矩阵 for(int m = 1; m < u; ++m){ for(int j = 0; j < u; ++j)//j代表列数 { if(j == k) continue; //此处的含义是删除含有k的这一列,与下面的k++相呼应 D_new[line][++row] = a[m][j]; } line++; row = 0; } if(i % 2 == 0) ans -= a[0][i] * Deter(D_new, u - 1, 0), k++;//k的意思是删除这一列的数 else ans += a[0][i] * Deter(D_new, u - 1, 0), k++; } } int main() { int n; cout << "输入行列式的阶数:"; cin >> n; for(int i = 0; i < n; ++i) for(int j = 0; j < n; ++j){ cin >> D[i][j]; } int ans = 0; ans = Deter(D, n, 0); cout << ans; system("pause"); return 0; }
-
线性代数行列式计算之迭代法
2021-07-09 19:19:36线性代数行列式计算之迭代法 声明与简介 线性代数行列式计算之迭代法是利用行列式逐阶展开式会发现或总结出n阶和n-1阶、n-2阶以及剩余阶的关系式,进而推算出整个行列式的最终结果。比如可以由 或反过来(),总之...线性代数行列式计算之迭代法
声明与简介
线性代数行列式计算之迭代法是利用行列式逐阶展开式会发现或总结出n阶和n-1阶、n-2阶以及剩余阶的关系式,进而推算出整个行列式的最终结果。比如可以由
或反过来(
),总之能找出一个逐级演变的推导关系式。迭代法又称之为递推法。
迭代法
正向迭代
根据给的行列式可以直观的找出n阶和n-1阶的关系式,这种方法叫做直接迭代法。详见如下示例:
计算n阶行列式:
#1 思路
Step1 先观察行列式的特点,再整理思路
Step2 如果我们对第1行应用行列式展开会出来2项,其中对应
的项和
在形式或者结构上是一样的,这样就形成了一种循环即迭代。
Step3 按照Step2的方法对n、n-1、n-2… 1阶进行展开进而得到最终结果。
#2 实操
Step1:按照第1行对行列(0多,实际仅2个元素)式进行展开
结果为:Step2:因为
是
,所以由上述总结的关系不难得出最终结果为:
推导总结
根据给的行列式可以间接找到找出n阶和n-1阶的关系式,然后再逐步降阶整理得到最终结果。详见如下示例:
计算n阶行列式
#1 思路
Step1 先观察行列式的特点,再整理思路
Step2 如果我们对第1行按照行列式代数余子式展开时不难发现会出现n阶和n-1阶的关系。
Step3 总结Step2里的规律,最终写出表达式和最终结果。
#2实操
Step1:按照第1行对原行列式展开
得如下结果
Step2: 我们对式子做些变换
因为这里
,
,所以
Step3: 由Step2进而得到关系式
逐步降阶展开得到最后的结果为:
-
3 * 3 矩阵行列式 计算
2019-07-01 16:07:15就是计算一个3 * 3 和 一个 2 * 2 的行列式。 思路如下 把x和y分开来看各自的变化规律 x 始终是 1 => 2 => 3 y 是一个循环变化的过程,那就 ( y + 1 )% 3 来表示循环变化的过程。 这样这个过程就可以用两层... -
用行列式的定义方法求解n阶行列式的值(C++)
2017-03-15 22:27:23用行列式的定义方法求解行列式的值,方法肯定不是最简单的,但是觉得有趣。其中要用到全排列的递归算法、逆序数的算法 #include<iostream> using namespace std; const int n = 3; //n为行列式的阶数 int z... -
5.6 高斯方法求行列式
2022-03-24 19:32:10介绍使用高斯消元法求行列式,并提供java及python语言的实现 -
行列式的值.txt
2019-10-22 14:53:59/*以下为计算行列式值的递归函数——按行列式的第一列展开*/ int Fun(int n,int a[MAX][MAX]) { int i=0, j=0, c=0; /*i,j为行与列,c为数组b的行*/ int b[MAX][MAX]={{0}};/*定义数组b并初始化*/ int p=0, ... -
C语言展开法和全排列法实现n阶行列式计算
2021-08-07 15:12:48给大家介绍一下C语言实现行列式计算的两种方法,分别为展开法和全排列计算法 一.展开法 展开法的计算方法为,将一行或一列的(n-1)个元素置为0,剩余一个元素置为1,让我们直接来看看代码 目录 给大家介绍... -
求行列式的值,用C语言怎么写啊? 如何求行列式的值
2021-05-19 13:06:54导航:网站首页 >... 如何求行列式的值相关问题:匿名网友:行列式计算公式知道吧,给你个源码参考,大一时写的。#include #include #define MAX 9 /*定义最大为9阶行列式*/int Fun(int n, int a[MAX][MAX]... -
Python入门教程: 计算范德蒙矩阵的行列式
2020-12-08 09:55:02我想, 这个教程不按照传统的思路来写, 毕竟实践才是学习的最好途径。这里在前面学习了基本的数据类型之后, 我直接跳到用Python来计算一个方块矩阵的...范德蒙矩阵的生成我们这里给出生成范德蒙行列式的一个方法, ... -
C++ 代码实现定义法计算行列式的值
2021-11-14 14:27:21C++代码实现定义法求行列式的值 (闲的蛋疼) -
【算法】递归算法之n阶矩阵行列式求解
2021-04-17 07:20:32在计算行列式的时候需要移除元素所在的行和列,生成一个减小了一个维度的矩阵,我们需要编写一个方法来完成这个操作,我命名他为removeRowAndCol();还有一个方法,由于相加的时候会产生符号的改变,所以需要写一个... -
n阶行列式计算----c语言实现(完结)
2014-12-19 21:42:12花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深。时间复杂度具体没有细看,... -
递归求解行列式
2019-09-29 20:22:50晚上朋友说写个行列式程序,就兴致勃勃地写了下来,给大家参考。 行列式: 行列式在数学中,是一个...除去化简行列式为上下三角行列式的方法之外,由行列式的手工朴素解法(模拟),易得求解行列式可以使用递归的... -
高等代数中行列式的计算总结
2016-04-10 12:31:29行列式的计算 -
行列式的辗转相减
2021-12-29 15:15:27行列式计算器,但是不要超过10哦! -
计算行列式的值
2017-07-11 22:29:50计算行列式的值 -
行列式计算(C#)
2021-05-26 01:58:02【行列式计算(C#)】的更多相关文章最近几天学习高等代数老师说要写个程序算行列式的结果,闲来无事就简单写了一下. 不多说了,上代码 using System; using System.Collections.Generic; using System.Linq; using ... -
线性代数求行列式的值(用C++程序轻松解决)
2020-04-20 09:28:54线性代数行列式求值算的可真是让人CPU疼,但计算机是不累的,所以用一个c++程序帮助你验证求解行列式的值吧。 本文介绍了三种算法,虽然还没有完成--.-- -
求行列式的值,用C语言怎么写啊?
2021-05-24 00:55:25优质回答 回答者:徐州小可爱行列式计算公式知道吧,给你个源码参考,大一时写的。#include #include #define MAX 9 /*定义最大为9阶行列式*/int Fun(int n, int a[MAX][MAX] ); /*函数声明*/int main(){int n = 0; ... -
方阵行列式并行化计算(OpenMP,MPI),并计算加速比
2018-04-10 11:19:211 实验目的本实验的目的主要有以下三点:1、 实现方阵行列式的计算。2、 实现方阵行列式的并行计算,分别基于 OpenMP和 MPI。3、 比较以上三种算法的运行时间,计算加速比。2 实验设计2.1 生成方阵为方便,本... -
线代一开始学起来行列式计算起来真麻烦,自己尝试用C++编代码计算N阶行列式
2020-02-24 22:41:53老师让我们课余时间利用所学编写一个程序计算1600阶行列式的值,我一开始使用归纳法的思想去想的,先编出一个二阶行列式的代码,再编一个三阶行列式,二者一组合,得到他们的共有部分,但是我发现for 结构太多了,... -
第一章,用行列式解线性方程组,02-二阶与三阶行列式
2020-07-19 10:51:43第一章,用行列式解线性方程组,02-初识行列式简介2.1 二阶行列式2.1.1 定义2.1.2 对角线法则2.1.3 二元线性方程组解的行列式表示2.2 三阶行列式2.2.1 定义2.2.2 对角线法则2.2.3 三元线性方程组解的行列式表示 ... -
C语言求行列式的值——余子式展开
2021-04-02 21:16:28大家都知道计算行列式的一种方法,通过代数余子式展开可以降行列式的阶数,从而简化问题。 任意n阶行列式都可以化为二阶行列式线性之和,利用这个原理,我们采用递归算法,应该效率还算可以吧。 本人能力实属有限,... -
递归法求解矩阵行列式
2016-08-22 10:23:34在线性代数教材中,常用按行/列展开方式求解方阵行列式,所以根据这个思路,我编写了相应的C语言程序:该程序采用了递归的方法,由于递归方式会耗用大量内存空间,所以本程序存在相应的缺点,经测 -
求矩阵乘法及行列式的值
2020-04-01 12:40:16n阶行列式计算 方法:将大矩阵不断分解为小矩阵来缩小其规模,最后逐层返回答案。 java实现 import java.util.Scanner; class Main { public static void main(String []args) { Scanner sc=new Scanner... -
递归法实现n阶行列式求值(c语言实现)
2021-03-04 11:44:08递归法实现n阶行列式求值(c语言实现) #include<stdio.h> #include<stdlib.h> int main(){ double f(int N,int (*p)[N]);//函数接口,N表示阶数,p为指向数组的指针 int i,j,num; printf("请输入阶数:\n...