N维矩阵求逆过程,C++实现

矩阵求逆的过程,本文利用伴随矩阵方法求逆

主要利用该公式

A^{-1}=\frac{1}{\left |A \right |}\cdot A^{*}

其中

A为N阶矩阵

\left | A \right |A的行列式,一个数值,标量

A^{*}A的伴随矩阵,具体伴随矩阵求解方法见学习过程中得一些算法及理解记录20220617

代码如下

#include <iostream>	
#include <ctime>    
using namespace std;
#define N 2   	
//N 为维数,可以改成3,4,5,6...多少维度都行
	

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;	
}	
	

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];	
			}	
		}	
	}	
}	
	

bool GetMatrixInverse(double src[N][N],int n,double des[N][N])
{	
	double flag=getA(src,n);	
	double t[N][N];	
	if(0==flag)	
	{	
		cout<< "原矩阵行列式为0,无法求逆。请重新运行" <<endl;
		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()	
{	
	bool flag;
	int row =N;	
	int col=N;	
	double matrix_before[N][N]{};//{1,2,3"	",4,5,6,7,8,9};
	

	srand((unsigned)time(0));	
	for(int i=0; i<N ;i++)	
	{	
		for(int j=0; j<N;j++)	
		{	
			matrix_before[i][j]=rand()%100 *0.01;
		}	
	}	
	if(N==2){
		matrix_before[0][0]=	1.80138	;
		matrix_before[0][1]=	-1	;
		matrix_before[1][0]=	3.80138	;
		matrix_before[1][1]=	2.4897	;
	}
		
		
	cout<<"原矩阵:"<<endl;
		
	for(int i=0; i<N ;i++)	
	{	
		for(int j=0; j<N;j++)	
		{	
			//cout << matrix_before[i][j]	"<<"" "";"
			cout << *(*(matrix_before+i)+	j)<<" ";
		}	
		cout<<endl;	
	}	
	cout<<endl;	
		
	double matrix_after[N][N]{};	
	flag=GetMatrixInverse(matrix_before,N,matrix_after);
	if(false==flag)	
		return 0;	
		
		
	cout<<"逆矩阵:"<<endl;
		
	for(int i=0; i<row ;i++)	
	{	
		for(int j=0; j<col;j++)	
		{	
			cout <<matrix_after[i][j] <<"	";
			//cout << *(*(matrix_after+i)	"+j)<<"" "";"
		}	
		cout<<endl;	
	}	
	cout<<endl;	
	
	GetMatrixInverse(matrix_after,N,matrix_before);
		
	cout<<"反算的原矩阵:"<<endl;//
		
	for(int i=0; i<N ;i++)	
	{	
		for(int j=0; j<N;j++)	
			{	
				//cout << matrix_before[i][j]	"<<" "";
				cout << *(*(matrix_before+i)+j)<<" ";
			}	
		cout<<endl;	
	}	
		
		
	return 0;	
}	

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值