代码实现任意维度矩阵求逆(C语言 用伴随矩阵实现)

一、伴随矩阵法求逆

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

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

 

 具体的代码实现如下:(3阶、4阶、5阶矩阵已验证)

#include<stdio.h>
#include<assert.h>
#include<math.h>
#define N 4
void adjoint_Matrix(float bansui[N][N],const float a[N][N],int row,int column);
float HlsCalculate(const float a[N][N],const int row,const int column);

//如果想要测试不同维度的矩阵,需要修改宏定义中的值N

int main(){
	//const float a[N][N] = {{1,2,3},{0,1,4},{5,6,0}};
	//inverse_a[3][3] = {{-24,18,5},{20,-15,-4},{-5,4,1}}
	const float a[N][N] = {{6,2,-1,2},{5,0,4,-10},{-9,-4,2,0},{6,8,2,-10}};
	float bansui[N][N] = {0};
	float inverse[N][N] = {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("%6.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("%6.2f ",inverse[i][j]);
		}
		printf("\n");
	}


	printf("==========原矩阵==========\n");
	for( i = 0; i < row ;i++){
		for(j = 0 ; j < column ; j++){
			printf("%6.2f ",a[i][j]);
		}
		printf("\n");
	}
}

//求行列式
float HlsCalculate(const float x[N][N],const int row,const int column){
	float hls = 0;
	float c[N][N] = {0};
	if(row == 1){
		return x[0][0];
	}
	if(row == 2){
		float k = x[0][0]*x[1][1] - x[0][1]*x[1][0];
		//printf("2dimention hls= %f\n",k);
		return k;
	}
	int i ,j , k ;
	//求行列式
	for(j = 0;j < row ;j++){
		for(i = 0 ; i < column - 1;i++){
			for(k = 0 ; k < row - 1;k++){
				if(k<j)c[i][k] = x[i+1][k];
				if(k>=j)c[i][k] = x[i+1][k+1];
			}
		}
		hls += pow(-1,j)*x[0][j]*HlsCalculate(c,row-1,column-1);
	}
	//printf("原矩阵的行列式 = %f\n",hls);
	return hls;
}
//求伴随矩阵
void adjoint_Matrix(float bansui[N][N],const float a[N][N],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[N][N]
			//float tempArr[N][N] = {0};
			float tempArr[N][N] = {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++;
						}
					}
				}
			}	
			float k =  HlsCalculate(tempArr,row-1,column-1);
			bansui[nn++][mm] =pow(-1,i+j) * HlsCalculate(tempArr,row-1,column-1);
			if(nn == column ){
				nn = 0;
				mm++;
			}
		}
	}
	
	
}

5阶矩阵计算截图:

4阶矩阵计算截图:

注:在更换矩阵维度的时候要更换宏变量 N 的值

行列式参考博文:c语言计算行列式_tgkyrie的博客-CSDN博客_c语言计算行列式

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
复三角矩阵是指下三角矩阵和上三角矩阵的结合体,其中上三角部分和下三角部分都是对角线以下/以上的元素都为0的矩阵。要求对复三角矩阵进行求逆操作,可以进行如下C语言实现。 ```c #include <stdio.h> #include <stdlib.h> // 定义复三角矩阵结构体 typedef struct { int n; // 矩阵维度 double* A; // 存储矩阵元素的数组 } ComplexTriangularMatrix; // 初始化复三角矩阵 void initComplexTriangularMatrix(ComplexTriangularMatrix* matrix, int n) { matrix->n = n; matrix->A = (double*)malloc(sizeof(double) * n * n); } // 销毁复三角矩阵 void destroyComplexTriangularMatrix(ComplexTriangularMatrix* matrix) { free(matrix->A); } // 复三角矩阵求逆 void inverseComplexTriangularMatrix(ComplexTriangularMatrix* matrix) { int n = matrix->n; double* A = matrix->A; // 逐列求逆 for (int j = 0; j < n; j++) { for (int i = 0; i <= j; i++) { if (i == j) { A[i * n + j] = 1.0 / A[i * n + j]; // 对角线上的元素取倒数 } else { double sum = 0.0; // 求和 for (int k = i; k < j; k++) { sum += A[i * n + k] * A[k * n + j]; } A[i * n + j] = -sum / A[j * n + j]; } } } } int main() { int n = 3; ComplexTriangularMatrix matrix; initComplexTriangularMatrix(&matrix, n); // 假设复三角矩阵的元素 matrix.A[0] = 1.0; matrix.A[1] = 0.0; matrix.A[2] = 0.0; matrix.A[3] = 2.0; matrix.A[4] = 1.0; matrix.A[5] = 0.0; matrix.A[6] = 3.0; matrix.A[7] = 4.0; matrix.A[8] = 1.0; inverseComplexTriangularMatrix(&matrix); // 输出逆矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%f ", matrix.A[i * n + j]); } printf("\n"); } destroyComplexTriangularMatrix(&matrix); return 0; } ``` 该代码实现了复三角矩阵的求逆操作,通过给定的复三角矩阵,逐列进行求逆。在求逆过程中,对角线上的元素取倒数,其他非对角线元素计算出来并取相反数。最后输出求得的逆矩阵
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值