zoukankan      html  css  js  c++  java
  • 求一个矩阵的逆矩阵(用伴随矩阵求)

    题目: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 }
  • 相关阅读:
    使用Speex中的AEC模块,提高声音质量(转)
    音频编解码speex库的使用方法
    VC 多线程编程(转)
    并口、串口、COM口区别
    用GDB调试程序
    [转]PCM文件格式
    PreTranslateMessage作用和使用方法
    音频编解码标准
    VS2010 运行速度加快方法(转)
    ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/5893770.html
Copyright © 2011-2022 走看看