1.具体思想:
关于计算矩阵行列式有两个主要方法:
1.根据矩阵行列式的定义式用递归计算(就是本文所讲)
2.先做矩阵行变换,转化为上三角矩阵,再求行列式。
(我先是思考了行变换转化为三角矩阵,但中途遇到了些问题,所以先把递归的方法写下来,之后会继续更新另外一种方法。)
线性代数里我们已经了解了递归求矩阵行列式的方法。下图:

然后每一个代数余子式又可以看做相对于“n阶母矩阵”的“n-1阶子矩阵”,再次对这个子矩阵按照行或列展开,这就是递归求矩阵行列式的思想。
2.三元组和二维数组
二维数组不用多说,它和矩阵是一一对应的,表示完全相同。
三元组是指形如((r,c),d)的集合,我们规定(r,c)是三元组中的一个数在二维数组中的对应位置,d表示数据的值。
三元组的数据结构如下:
- 1 typedef struct
- 2 {
- 3 int r;
- 4 int c;
- 5 int d;
- 6 }TupNode;
- 7 typedef struct
- 8 {
- 9 int rows;
- 10 int cols;
- 11 int nums;
- 12 TupNode data[Maxsize];
- 13 }TSMatrix;
具体的计算行列式代码如下:
- 1 //计算矩阵行列式
- 2 int DatMat(TSMatrix t){
- 3 if(t.cols!=t.rows){
- 4 printf("该矩阵无法求行列式!");
- 5 return 0;
- 6 }
- 7 else{
- 8 int n=t.cols;
- 9 int a[n][n];
- 10 //将三元组转化为二维数组
- 11 for(int i=0;i<n;i++){
- 12 for(int j=0;j<n;j++){
- 13 a[i][j]=0;
- 14 }
- 15 }
- 16 for(int k=0;k<t.nums;k++){
- 17 int i = t.data[k].r;
- 18 int j = t.data[k].c;
- 19 a[i][j] = t.data[k].d;
- 20 }
- 21 if (n == 1){
- 22 return a[0][0];
- 23 }
- 24 else{
- 25 int b[n-1][n-1];//创建n-1阶的代数余子式阵bb
- 26 int c[(n-1)*(n-1)];
- 27 int sum = 0;//sum为行列式的值
- 28 TSMatrix t1;
- 29
- 30 //以第一列为基础,求行列式
- 31 for(int l=0;l<n;l++){
- 32 int m1=0;
- 33 int m2=0;
- 34 for(int i =0;i<n;i++){
- 35 for(int j=0;j<n;j++){
- 36 if(i!=l&&j!=0){
- 37 c[m1]=a[i][j];
- 38 m1++;
- 39 }
- 40 }
- 41 }
- 42 for(int i =0;i<n-1;i++){
- 43 for(int j=0;j<n-1;j++){
- 44 b[i][j]=c[m2];
- 45 m2++;
- 46 }
- 47 }
- 48
- 49 //把二维数组转化为三元组
- 50 t1.rows=n-1;
- 51 t1.cols=n-1;
- 52 t1.nums=0;
- 53 for(int i=0;i<n-1;i++){
- 54 for(int j=0;j<n-1;j++){
- 55 if(b[i][j]!=0){
- 56 t1.data[t1.nums].r=i;
- 57 t1.data[t1.nums].c=j;
- 58 t1.data[t1.nums].d=b[i][j];
- 59 t1.nums++;
- 60 }
- 61 }
- 62 }
- 63 sum+=a[l][0]*DatMat(t1)*pow(-1,l);//通过递归来求行列式的值
- 64 }
- 65 return sum;
- 66 }
- 67 }
- 68 }