#include<stdio.h>
#include<stdlib.h>
double det(double **D,int n) //输入代表矩阵的二维数组、矩阵阶数,返回矩阵的行列式
{
double d=0;
// 一阶二阶直接计算
if(n==1)d=D[0][0];
if(n==2)d=D[0][0]*D[1][1]-D[0][1]*D[1][0];
else{
for(int k=0;k<n;k++){
// 为代数余子式申请内存
double **M;
M=(double**)malloc((n-1)*sizeof(double*));
for(int i=0;i<n-1;i++)
M[i]=(double*)malloc((n-1)*sizeof(double));
// 为代数余子式赋值
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1;j++)
M[i][j]=D[i+1][j<k?j:j+1];
// 按第一行展开,递归计算行列式,注意元素0则不展开可以加快计算速度
if(D[0][k])
d+=D[0][k]*det(M,n-1)*(((2+k)%2)?-1:1);
// 释放内存
for(int i=0;i<n-1;i++)free(M[i]);
free(M);
}
}
return d;
}
int main()
{
// 输入矩阵阶数
int n;
printf("n:");scanf("%d",&n);
// 为矩阵申请内存
double **D;
D=(double**)malloc(n*sizeof(double*));
for(int i=0;i<n;i++)
D[i]=(double*)malloc(n*sizeof(double));
// 矩阵输入
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
//scanf("%lf",&D[i][j]);
D[i][j]=rand()%10;
printf("D:\n");
// 打印矩阵
for(int i=0;i<n;i++){
{for(int j=0;j<n;j++)
printf("%g\t",D[i][j]);}
printf("\n");
}
// 输出行列式
printf("det(D)=%g\n",det(D,n));
//system("pause");
// 释放内存
for(int i=0;i<n;i++)free(D[i]);
free(D);
return 0;
}
C/C++——计算矩阵的行列式
最新推荐文章于 2024-07-29 17:35:21 发布