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

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 } 

 

转载于:https://www.cnblogs.com/OrdinaryMan/p/10022255.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值