欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

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

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 }