欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言计算行列式以及代数余子式的函数

程序员文章站 2022-07-12 14:13:56
...

C语言计算行列式以及代数余子式的函数

#include<stdio.h>
#define N 50
double algebraic_cofactor(double P[N][N],int m,int a,int b);
double determinant(double P[N][N],int m);

void main()
{
	double P[N][N];//待求矩阵
	int m,a,b;
}

double algebraic_cofactor(double P[N][N],int m,int a,int b)//求代数余子式;m为阶数;a、b分别为元素所在的行与列
{	
	int i,j,x,z;
	double sum;
	if(m<2) printf("输入错误,矩阵小于2阶");
	else if(m==2) sum=P[m-a][m-b];
	else
	{
		double Q[N][N]={0};
		x=0;
		for(i=0;i<m;i++)//创造一个m-1阶的矩阵(除去所求元素所在的行和列)
		{
			if(i==a-1) continue;
			z=0;
			for(j=0;j<m;j++)
			{
				if(j==b-1) continue;
				Q[x][z]=P[i][j];
				z++;
			}
			x++;
		}
		sum=determinant(Q,m-1);//求行列式
	}
	if((a+b)%2!=0) sum*=-1;
	return sum;
}

double determinant(double P[N][N],int m)//求行列式;m为阶数
{
	int k;
	double sum=0;
	for(k=0;k<m;k++)
	{
		if(P[0][k]==0) continue;
		else sum+=algebraic_cofactor(P,m,1,k+1)*P[0][k];//求代数余子式
	}
	return sum;
}

主要思路是通过代数余子式函数与行列式函数相互调用求解,由此可拓展出矩阵求逆的函数:

void main()//main函数中加入声明Q数组来存储逆矩阵
{
	double P[N][N];//待求矩阵
	double Q[N][N];//待求逆矩阵
	int m,a,b;
}

void inverse_matrix(double P[N][N],double Q[N][N],int m)//求逆矩阵;m为阶数
{
	int i,j,k,l;
	double A,B;
	A=determinant(P,m);
	if(A!=0) 
	{
		for(i=0;i<m;i++)
			for(j=0;j<m;j++)
				Q[i][j]=algebraic_cofactor(P,m,i+1,j+1);//计算伴随矩阵
		B=1/A;
		matrix_X_num(Q,B,m,m);
		transpose(Q);//矩阵转置
	}
	else printf("错误:矩阵不可逆");
}
void transpose(double P[N][N])//矩阵转置
{
	double T[N][N];
	int i,j;
	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
			T[j][i]=B[i][j];
	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
			B[i][j]=T[i][j];
}