告别矩阵繁琐运算,让c++程序助你轻松求矩阵的逆

线性代数矩阵求逆让人头疼,本文中献上一个可爱的c++程序帮助你求逆。

基本思路——用伴随矩阵

在这里插入图片描述
摘自百度百科

伴随矩阵有一条性质:如果A可逆则
AA*=|A|E;
所以矩阵A的逆即为 A* / |A|,这里就是根据这一特性求矩阵(方阵)的逆:

矩阵求逆算法

没用到什么算法,就简单的暴力求解了,方便简单就行!嘿嘿!

  1. 求矩阵中每一项的代数余子式
  2. 求每项代数余子式的值,构成伴随矩阵A*
  3. 求原矩阵的值 |A|
  4. 将伴随矩阵A*的每一项除以|A|即可

总之用到下面三个函数

求代数余子式函数


//计算方阵arcs每一行每一列的每个元素所对应的余子式,组成伴随矩阵ans[N]
void  getAStart(double arcs[N][N],int n,double ans[N][N])
{
    
    
    if(n==1)
    {
    
    
        ans[0][0] = 1;
        return;
    }
    int i,j,k,t;
    double temp[N][N];
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n;j++)
        {
    
    
            for(k=0;k<n-1;k++)
            {
    
    
                for(t=0;t<n-1;t++)
                {
    
    
                    temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t];
                }
            }


            ans[j][i]  =  getA(temp,n-1);
            if((i+j)%2 == 1)
            {
    
    
                ans[j][i] = - ans[j][i];
            }
        }
    }
}

行列式展开求值函数

 //按第一行展开计算|A|
double getA(double arcs[N][N],int n)
{
    
    
    if(n==1)
    {
    
    
        return arcs[0][0]; 
    }
    double ans = 0;
    double temp[N][N]={
    
    0.0};
    int i,j,k;
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n-1;j++)
        {
    
    
            for(k=0;k<n-1;k++)
            {
    
    
                temp[j][k] = arcs[j+1][(k>=i)?k+1:k];

            }
        }
        double t = getA(temp,n-1);
        if(i%2==0)
        {
    
    
            ans += arcs[0][i]*t;
        }
        else
        {
    
    
            ans -=  arcs[0][i]*t;
        }
    }
    return ans;
}

求矩阵的逆的函数

直接调用这个函数即可


//得到给定矩阵src的逆矩阵保存到des中。
bool GetMatrixInverse(double src[N][N],int n,double des[N][N])
{
    
    
    double flag=getA(src,n);
    double t[N][N];
    if(flag==0)
    {
    
    
        return false;
    }
    else
    {
    
    
        getAStart(src,n,t);
        for(int i=0;i<n;i++)
        {
    
    
            for(int j=0;j<n;j++)
            {
    
    
                des[i][j]=t[i][j]/flag;
            }

        }
    }


    return true;

}

附上可直接操作的源代码

#include<bits/stdc++.h>
using namespace std;
const int N = 3;//行列式的阶数

 
 //按第一行展开计算|A|
double getA(double arcs[N][N],int n)
{
    
    
    if(n==1)
    {
    
    
        return arcs[0][0]; 
    }
    double ans = 0;
    double temp[N][N]={
    
    0.0};
    int i,j,k;
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n-1;j++)
        {
    
    
            for(k=0;k<n-1;k++)
            {
    
    
                temp[j][k] = arcs[j+1][(k>=i)?k+1:k];

            }
        }
        double t = getA(temp,n-1);
        if(i%2==0)
        {
    
    
            ans += arcs[0][i]*t;
        }
        else
        {
    
    
            ans -=  arcs[0][i]*t;
        }
    }
    return ans;
}

//计算每一行每一列的每个元素所对应的余子式,组成A*
void  getAStart(double arcs[N][N],int n,double ans[N][N])
{
    
    
    if(n==1)
    {
    
    
        ans[0][0] = 1;
        return;
    }
    int i,j,k,t;
    double temp[N][N];
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n;j++)
        {
    
    
            for(k=0;k<n-1;k++)
            {
    
    
                for(t=0;t<n-1;t++)
                {
    
    
                    temp[k][t] = arcs[k>=i?k+1:k][t>=j?t+1:t];
                }
            }


            ans[j][i]  =  getA(temp,n-1);
            if((i+j)%2 == 1)
            {
    
    
                ans[j][i] = - ans[j][i];
            }
        }
    }
}
//得到给定矩阵src的逆矩阵保存到des中。
bool GetMatrixInverse(double src[N][N],int n,double des[N][N])
{
    
    
    double flag=getA(src,n);
    double t[N][N];
    if(flag==0)
    {
    
    
        return false;
    }
    else
    {
    
    
        getAStart(src,n,t);
        for(int i=0;i<n;i++)
        {
    
    
            for(int j=0;j<n;j++)
            {
    
    
                des[i][j]=t[i][j]/flag;
            }

        }
    }


    return true;

}

int main(){
    
    
	
	double a[N][N];
	double ans[N][N];
	cout << " 请输入"<<N<<" 阶矩阵:"<<endl; 
	for(int i=0;i<N;i++)
	for(int j=0;j<N;j++)
	{
    
    
		cin >> a[i][j];
	}
	GetMatrixInverse(a,N,ans);
	cout<<" 该矩阵的逆为:"<<endl; 
	for(int i=0;i<N;i++)
	{
    
    
		for(int j=0;j<N;j++)
	{
    
    
		cout << ans[i][j]<<"   ";
	}
	cout<<endl;
	}
	
} 

实现线性代数运算的其它程序链接

猜你喜欢

转载自blog.csdn.net/qq_45768060/article/details/105630205
今日推荐