Loading

算法与数据结构(二)三元组矩阵行列式的计算(用递归)

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 } 

 

posted @ 2018-11-26 19:12  OrdinaryMan  阅读(1982)  评论(0编辑  收藏  举报