1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)

代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)

时间:2020-11-11 02:10:05

相关推荐

代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)

一、伴随矩阵法求逆

一个方阵A如果满足|A| != 0,则可以认为矩阵A可逆,其逆矩阵为:

使用伴随矩阵求逆法最关键的一步是如何求矩阵A的伴随矩阵A*,A*求解如下图:

具体的代码实现如下:

#include<stdio.h>#include<assert.h>#include<math.h>void adjoint_Matrix(float bansui[3][3],const float a[3][3],int row,int column);float HlsCalculate(const float a[3][3],const int row,const int column);int main(){const float a[3][3] = {{1,2,3},{0,1,4},{5,6,0}};//inverse_a[3][3] = {{-24,18,5},{20,-15,-4},{-5,4,1}}float bansui[3][3] = {0};float inverse[3][3] = {0};float hls = 0;int i , j;int row = sizeof(a[0])/sizeof(a[0][0]);int column = sizeof(a)/(row * sizeof(a[0][0]));printf("row = %d column = %d\n",row,column);assert(row == column);//求原矩阵的行列式hls = HlsCalculate(a,row,column);//hls = HlsCalculate(a,row,column);if(hls == 0){printf("is not inverse matrix\n");assert(hls != 0);}//求伴随矩阵adjoint_Matrix(bansui, a,row,column);//输出伴随矩阵printf("==========伴随矩阵==========\n");for( i = 0; i < row ;i++){for(j = 0 ; j < column ; j++){printf("%.2f ",bansui[i][j]);}printf("\n");}//求逆矩阵,公式法(A-1)*(A*) = |A|printf("======逆矩阵=====\n");for( i = 0; i < row ;i++){for(j = 0 ; j < column ; j++){inverse[i][j] = (1/hls)*bansui[i][j];printf("%.2f ",inverse[i][j]);}printf("\n");}printf("==========原矩阵==========\n");for( i = 0; i < row ;i++){for(j = 0 ; j < column ; j++){printf("%.2f ",a[i][j]);}printf("\n");}}//求行列式float HlsCalculate(const float x[3][3],const int row,const int column){float hls = 0;float tmp = 1;float tmp1 = 1;//printf("========================\n");if(row == 2){/*printf("需要求的代数余子式的矩阵:\n");for(int i = 0; i < row ; i++){for(int j = 0 ; j < column ;j++){printf("%.2f ",x[i][j]);}printf("\n");}*///printf("========================\n");float k = x[0][0]*x[1][1] - x[0][1]*x[1][0];//printf("2dimention hls= %f\n",k);return k;}for(int i = 0 ; i < row ;i++){tmp = 1;tmp1 = 1;int k = i;for(int j = 0 ; j < column ; j++){if(k >= row){k = 0;}tmp1 = tmp1 * x[j][column - 1 - k];tmp = tmp * x[j][k++]; //printf("a[][] = %f , tmp = %f \n",a[j][ k - 1],tmp);}hls += tmp - tmp1;}printf("原矩阵的行列式 = %f\n",hls);return hls;}//求伴随矩阵void adjoint_Matrix(float bansui[3][3],const float a[3][3],int row,int column){int n=0,m=0,nn = 0,mm = 0;int sum =0;int i,j;for( i = 0; i < row ;i++){for(j = 0 ; j < column ; j++){//定义了一个临时矩阵tempArr[3][3]//float tempArr[3][3] = {0};float tempArr[3][3] = {0};n = 0;m = 0;for(int p = 0; p < row ;p++){//求代数余子式for(int q = 0 ;q < column ;q++){if(!(p == i || q ==j)){tempArr[n][m++] = a[p][q];if(m == column - 1){m = 0;n++;}}}}//printf("------------------sum = %d \n",++sum);float k = HlsCalculate(tempArr,row-1,column-1);//printf("代数余子式=%.2f\n",k);bansui[nn++][mm] =pow(-1,i+j) * HlsCalculate(tempArr,row-1,column-1);if(nn == column ){nn = 0;mm++;}}}}

该方法的实验结果如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。