代码实现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++;
			}
		}
	}
}

该方法的实验结果如下:

 

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用C语言实现高维矩阵的求逆矩阵操作,我们可以使用线性代数库中的函数。一个常用的线性代数库是LAPACK(Linear Algebra Package)库,它包含了许多高效且可靠的线性代数算法。 首先,我们需要在程序中引入LAPACK库,并根据需要的功能选择合适的函数。其中,求解逆矩阵的函数是"dgels"。这个函数可以解决超定或低于超定的线性系统,其中包括求解逆矩阵。通过调用该函数,我们可以将高维矩阵求逆。 接下来,我们需要定义一个高维矩阵并初始化它。在这个例子中,我们假设矩阵是一个3x3矩阵。使用C语言的数组进行定义和初始化。 然后,我们需要定义一个变量来存储LAPACK函数的返回值。如果返回值为0,则表示求解成功;其他值则表示出现了一些错误。 最后,使用"dgels"函数来求解逆矩阵。将高维矩阵、右侧矩阵和其他参数传递给该函数以进行计算。函数将把结果存储在原矩阵中。 以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <lapacke.h> #define N 3 // 定义高维矩阵的大小 int main() { double A[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 10}}; // 定义高维矩阵并初始化 int m, n, lda, ldb, info; m = n = N; lda = ldb = N; info = LAPACKE_dgels(LAPACK_ROW_MAJOR, 'N', m, n, 1, *A, lda, *B, ldb); // LAPACK_ROW_MAJOR 表示数组是以行优先存储的 // 'N' 表示不计算残差 if (info == 0) { printf("逆矩阵计算成功\n"); // 输出逆矩阵 printf("逆矩阵:\n"); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%lf ", A[i][j]); } printf("\n"); } } else { printf("逆矩阵计算失败\n"); } return 0; } ``` 这只是一个示例代码,只求解3x3的逆矩阵。根据你的需求,你可以修改代码以处理其他尺寸或输入源。希望这个回答对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值