求一个矩阵的逆矩阵(用伴随矩阵求)

题目:noyj774

用代数余子式求逆矩阵方法:

若现有矩阵A,要求其逆矩阵;

若|A|==0,则其不存在逆矩阵;

若|A|!=0,其逆矩阵A^-1==*A/|A|;其中*A为其伴随矩阵;

伴随矩阵的求法:

*A[j][i]==|M[i][j]|,其中M[i][j]为A[i][j]的代数余子式;

即*A1[i][j]==|M[i][j]|,再将*A1转置得到*A;

 

代码:

  1 #include<bits/stdc++.h>
  2 #define MAXN 10
  3 #define MAX 100000000
  4 #define ll long long
  5 using namespace std;
  6 
  7 int b[MAXN][MAXN]; //***存储伴随矩阵
  8 
  9 //***递归求n*n阶行列式的值
 10 int matrix(int n, int a1[MAXN][MAXN])
 11 {
 12     int b[10][10], sum=0;          //****b保存当前n*n阶行列式a的余子式
 13     if(n==1) return a1[0][0];     //****n为1时结束递归
 14     for(int i=0; i<n; i++)        //****通过循环求出当前行列式a[1][0]~a[1][n-1]的所有余子式
 15     {
 16         for(int j=0; j<n-1; j++)
 17         {
 18             int column=0;
 19             for(int k=0; k<n; k++)
 20             {
 21                 if(k==i) continue;
 22                 b[j][column++]=a1[j+1][k];  //**将a[0][i]的余子式保存到b数组中
 23             }
 24         }
 25         int flag=1;
 26         if(i&1) flag=-1;
 27         sum+=flag*a1[0][i]*matrix(n-1, b);
 28     }
 29     return sum;
 30 }
 31 
 32 //***求矩阵a的伴随矩阵
 33 void adjoint_matrix(int n, int a[MAXN][MAXN])
 34 {   
 35     for(int i=0; i<n; i++)
 36     {
 37         for(int j=0; j<n; j++)
 38         {
 39             int a1[MAXN][MAXN], row=0;
 40             for(int k=0; k<n; k++)   //****将a[i][j]的余子式存储到a1数组中;
 41             {
 42                 int column=0;
 43                 if(k==i) continue;
 44                 for(int l=0; l<n; l++)
 45                 {
 46                     if(l==j) continue;
 47                     a1[row][column++]=a[k][l];  
 48                 }
 49                 row++;
 50             }
 51             b[j][i]=pow(-1, i+j)*matrix(n-1, a1);  //****b中存储b[i][j]的算数余子式转置后的矩阵即求得伴随矩阵
 52         }
 53     }
 54 }
 55 
 56 void print(int n, int ans)
 57 {
 58     for(int i=0; i<n; i++)
 59     {
 60         for(int j=0; j<n; j++)
 61         {
 62             if(b[i][j]%ans==0)   
 63             {
 64                 cout << b[i][j]/ans << " ";
 65             }
 66             else             //******不能整除的话输出最简分式形式
 67             {
 68                 int cnt=__gcd(b[i][j], ans);
 69                 int x=b[i][j]/cnt, y=ans/cnt;
 70                 if(y<0)
 71                 {
 72                     cout << (-1*x) << "/" << (-1*y) << " ";
 73                 }
 74                 else
 75                 {
 76                     cout << x << "/" << y << " ";
 77                 }
 78             }
 79         }
 80         cout << endl;
 81     }
 82 }
 83 
 84 int main(void)
 85 {
 86     std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
 87     int n;
 88     while(cin >> n)
 89     {
 90         int a[MAXN][MAXN];
 91         for(int i=0; i<n; i++)
 92         {
 93             for(int j=0; j<n; j++)
 94             {
 95                 cin >> a[i][j];
 96             }
 97         }
 98         int ans=matrix(n, a);
 99         if(!ans)  //*******矩阵值为0即不存在逆矩阵
100         {
101             cout << "The input data is error!" << endl;
102             continue;
103         }
104         adjoint_matrix(n, a);
105         print(n, ans);
106     }
107     return 0;
108 }

 

posted @ 2016-09-21 18:39  geloutingyu  阅读(15936)  评论(0编辑  收藏  举报