一、伴随矩阵法求逆
一个方阵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 的值