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

一、伴随矩阵法求逆

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

代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)_第1张图片

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

 代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)_第2张图片

 具体的代码实现如下:

 

#include
#include
#include

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++;
			}
		}
	}
}

该方法的实验结果如下:

代码实现3X3矩阵求逆(C语言 用伴随矩阵实现)_第3张图片

 

你可能感兴趣的:(矩阵,线性代数,算法)