伴随矩阵法矩阵求逆

 

#include<bits/stdc++.h>
using namespace std;
int n,false_1=-1;

double det(int n, double *Mat)//递归求行列式 
{
	if (n==1)
	return Mat[0];
	else
	{
	double *subMat = new double[(n-1)*(n-1)];
	int cnt=0; 
	double sum=0.0;  
	for (int i=0;i<n;i++) //i对应为原矩阵的阶数 此处特指行数(取第一列元素的代数余子式) 
	{
		for (int subrow=0;subrow<n-1;subrow++)
		{
			cnt=(subrow<i?0:1); //如果代数余子式的行<原矩阵的行 则同行赋值 若≥ 则下一行赋值 即行数+1 
			for (int subcol=0;subcol<n-1;subcol++) 
			{
				subMat[subrow*(n-1)+subcol] = Mat[(subrow+cnt)*n+subcol+1];//将原矩阵元素赋给代数余子式 
			}
		}
		int sign=(i%2==0?1:-1);//经计算n*row元素的系数 和row%2有关 
		sum +=sign*Mat[i*n]*det(n-1,subMat);//a1i*A1i
	}
	delete[]subMat;
	return sum;
    }
}

double cofactor(int row,int col,double *mat,int n)//求伴随矩阵中的元素(余子式)
{
	double *cofactor1=new double[(n-1)*(n-1)];
	for(int i=0;i<n-1;i++)
	{
		int temp1=(i<row?0:1);
		for(int j=0;j<n-1;j++)
		{
			int temp2=(j<col?0:1);
			cofactor1[i*(n-1)+j]=mat[(i+temp1)*n+j+temp2];
		}
	}
	double sum=det(n-1,cofactor1)*pow(-1,1.0*(row+col));
	return sum;
} 

void adjoint(double *mat,int n,double *adjointmat)//求伴随矩阵 
{
	for(int i=0;i<n*n;i++)
	{
		adjointmat[i]=cofactor(i%n,((i-i%n)/n),mat,n); 
	}
}

int main()
{
	while(~scanf("%d",&n))
	{
		double *Mat=new double[n*n];
	    double *adjointmat=new double[n*n];
	    double detMat;
    	for(int i=0;i<n*n;i++)
    		cin>>Mat[i];
    	detMat=det(n,Mat);
    	if(detMat==0||n<=0)
    	{
    		cout<<false_1<<endl;
		}
		else if(n==1)
		{
			if(Mat[0]==0)
			cout<<false_1<<endl;
			else 
			printf("%.2lf\n",1.0/Mat[0]);
		}
		else
		{
        adjoint(Mat,n,adjointmat);//求伴随矩阵
		int index=0;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(adjointmat[index]==(-0))
				adjointmat[index]=0;
				printf("%.2lf",adjointmat[index]/detMat);
				if(j!=(n-1)) cout<<" ";
				index++;
			}
			cout<<endl;
		}
		delete[]Mat;
		delete[]adjointmat; 
	    }	
	}
	return 0;
}

写了这个感觉1起始选手确实有优势

0起始我好多计算要验证下hhh

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值