一、伴随矩阵法求逆
一个方阵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++;
}
}
}
}
该方法的实验结果如下: