# include & ltmalloc.h & gt
# include & ltstdio.h & gt
///& lt;總結& gt
///求行列式的絕對值
///& lt;/summary & gt;
///& lt;param name = " src " & gt輸入矩陣
///& lt;param name = " n " & gt矩陣的階
///& lt;returns & gt矩陣對應行列式的值
double mat_det(double *src[],const unsigned n){
if(2 & gt;n)返回src[0][0];
int subsize = n-1;
double * * sub vet =(double * *)malloc(sizeof(double *)* subsize);
for(int I = 0;我& lt子尺寸;++i)
sub vet[I]= src[I+1];
double value = mat_det(subvet,subsize)* src[0][subsize]*((subsize & amp;1) ?-1 : 1);
for(int I = 0;我& lt子尺寸;++i){
sub vet[I]= src[I];
value += mat_det(subvet,subsize)* src[I+1][subsize]*((n+I & amp;1) ?-1 : 1);
}
免費(sub vet);
返回值;
}
///& lt;總結& gt
///在矩陣的指定位置找到元素的代數余因子的值。
///& lt;/summary & gt;
///& lt;param name = " src " & gt輸入矩陣
///& lt;param name = " n " & gt矩陣的階
///& lt;param name = " x " & gt矩陣指定了元素坐標的x值
///& lt;param name = " y " & gt矩陣指定元素坐標的y值
///& lt;returns & gt對應於矩陣的指定元素的代數余因子的值
double mat_minor(double *src[],const unsigned n,const unsigned x,const unsigned y){
double * * minmat =(double * *)malloc(sizeof(double *)*(n-1));
for(無符號I = 0;我& ltn-1;++i){
minmat[I]=(double *)malloc(sizeof(double)*(n-1));
for(無符號j = 0;j & ltn-1;++j)
min mat[I][j]= src[I+(I & gt;= x)][j+(j & gt;= y)];
}
double value = mat_det(minmat,n-1)*(x+y & amp;1 ?-1 : 1);
for(無符號I = 0;我& ltn-1;++i)
free(minmat[I]);
免費(minmat);
返回值;
}
///& lt;總結& gt
///求矩陣的逆矩陣
///& lt;/summary & gt;
///& lt;param name = " src " & gt輸入矩陣
///& lt;param name = " des " & gt輸入矩陣的逆矩陣
///& lt;param name = " n " & gt矩陣的階
void mat_inv(double *src [],double *des[],const unsigned n){
double det = mat_det(src,n);//求矩陣行列式的值
for(無符號I = 0;我& ltn;++i){
for(無符號j = 0;j & ltn;++j)
des[i][j] = mat_minor(src,n,j,I)/det;
}
}
int main(){
double input[][3] = { { 8,4,9 },{ 2,3,5 },{ 7,6,1 } };
double output[][3] = { { 0 },{ 0 },{ 0 } };
double *src[3],* des[3];
//矩陣必須轉換成指針數組形式。
for(int I = 0;我& lt3;++i){
src[i] =輸入[I];
des[i] =輸出[I];
}
mat_inv(src,des,3);
for(int I = 0;我& lt3;++i){
for(int j = 0;j & lt3;++j)
printf("%lf\t ",des[I][j]);
printf(" \ n ");
}
返回0;
}