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];
}
上一篇: SQL简单查询与符合条件查询(一)
下一篇: 模仿sql查询集合对象过滤符合条件