c/c++语言开发共享三元组矩阵行列式的计算(用递归)

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


1.具体思想:

关于计算矩阵行列式有两个主要方法:

1.根据矩阵行列式的定义式用递归计算(就是c/c++开发分享三元组矩阵行列式的计算(用递归)所讲)

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 } 

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606172.html

(0)
上一篇 2021年5月13日
下一篇 2021年5月13日

精彩推荐