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

Posted ygeloutingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个矩阵的逆矩阵(用伴随矩阵求)相关的知识,希望对你有一定的参考价值。

题目: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;

 

代码:

#include<bits/stdc++.h>
#define MAXN 10
#define MAX 100000000
#define ll long long
using namespace std;

int b[MAXN][MAXN]; //***存储伴随矩阵

//***递归求n*n阶行列式的值
int matrix(int n, int a1[MAXN][MAXN])
{
    int b[10][10], sum=0;          //****b保存当前n*n阶行列式a的余子式
    if(n==1) return a1[0][0];     //****n为1时结束递归
    for(int i=0; i<n; i++)        //****通过循环求出当前行列式a[1][0]~a[1][n-1]的所有余子式
    {
        for(int j=0; j<n-1; j++)
        {
            int column=0;
            for(int k=0; k<n; k++)
            {
                if(k==i) continue;
                b[j][column++]=a1[j+1][k];  //**将a[0][i]的余子式保存到b数组中
            }
        }
        int flag=1;
        if(i&1) flag=-1;
        sum+=flag*a1[0][i]*matrix(n-1, b);
    }
    return sum;
}

//***求矩阵a的伴随矩阵
void adjoint_matrix(int n, int a[MAXN][MAXN])
{   
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            int a1[MAXN][MAXN], row=0;
            for(int k=0; k<n; k++)   //****将a[i][j]的余子式存储到a1数组中;
            {
                int column=0;
                if(k==i) continue;
                for(int l=0; l<n; l++)
                {
                    if(l==j) continue;
                    a1[row][column++]=a[k][l];  
                }
                row++;
            }
            b[j][i]=pow(-1, i+j)*matrix(n-1, a1);  //****b中存储b[i][j]的算数余子式转置后的矩阵即求得伴随矩阵
        }
    }
}

void print(int n, int ans)
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(b[i][j]%ans==0)   
            {
                cout << b[i][j]/ans << " ";
            }
            else             //******不能整除的话输出最简分式形式
            {
                int cnt=__gcd(b[i][j], ans);
                int x=b[i][j]/cnt, y=ans/cnt;
                if(y<0)
                {
                    cout << (-1*x) << "/" << (-1*y) << " ";
                }
                else
                {
                    cout << x << "/" << y << " ";
                }
            }
        }
        cout << endl;
    }
}

int main(void)
{
    std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n;
    while(cin >> n)
    {
        int a[MAXN][MAXN];
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
            {
                cin >> a[i][j];
            }
        }
        int ans=matrix(n, a);
        if(!ans)  //*******矩阵值为0即不存在逆矩阵
        {
            cout << "The input data is error!" << endl;
            continue;
        }
        adjoint_matrix(n, a);
        print(n, ans);
    }
    return 0;
}

以上是关于求一个矩阵的逆矩阵(用伴随矩阵求)的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB编程 逆矩阵怎么表示

numpy求两个矩阵中不同元素的个数

初等矩阵的行列式怎么求?

雅可比矩阵(偏导数矩阵)的逆矩阵代表啥含义

matlab中用左除和逆矩阵法 求方程 为啥答案不一样?

matlab中怎么求一个矩阵的共扼矩阵