下面的代码递归地计算q阶矩阵的行列式。它适用于q = 3和q = 2但是对于q = 4,它输出的垃圾值在每次运行程序时都会改变: 这里出了什么问题?
#include <stdio.h>
#include <math.h>
int det(int q, int arr[q][q]);
int main(void)
{
int arr[4][4] = {
{2,4,9,8},
{6,3,4,5},
{5,7,8,6},
{3,2,5,7}
};
printf("value of determinant is %d\n", det(4, arr));
}
int det(int q, int arr[q][q])
{
if(q>2)
{
int i, j, k, m, n, s[q-1][q-1], d=0, cof;
for(k=-1,i=0,j=0;k<q-1;k++)
{
i=0;j=0;
for(m=1;m<q;m++,i++)
{
n=0;j=0;
for(n,j;n<k+1;n++,j++)
{
s[i][j] = arr[m][n];
}
n=q-1+k;
for(n;n<q;n++,j++)
{
s[i][j] = (arr[m][n]);
}
}
cof = (arr[0][k+1])*(pow(-1,k+1));
d += cof*det(q-1, s);
}
return d;
}
else if(q==2)
{
int d = ((arr[0][0])*(arr[1][1])-(arr[0][1])*(arr[1][0]));
return d;
}
}
答案 0 :(得分:1)
在您的代码中,问题的主要根源是算法。我建议您刷新行列式概念。您可以查看下面的代码来检查您使用的算法中的错误。
#include <stdio.h>
#include <math.h>
int det(int q, int arr[q][q]);
int main(void)
{
int arr[5][5] = {
{2,4,9,1,2},
{6,3,4,2,6},
{5,7,8,6,9},
{9,1,5,3,3},
{3,2,5,3,9}
};
printf("value of determinant is %d\n", det(5, arr));
return 0;
}
int det(int q, int arr[q][q])
{
if(q>2)
{
int resultOfSubStep = 0 ; //Final result that will be returned
int smallerMatrix[q-1][q-1] ; //Matrix in which smaller matrix are to be stored which will be given as arguments to det function in current recursion
int i = 0 ;
for(;i<q;i++){
int j = 0 ;
for (;j<q-1;j++) { //This for loop copies the element required from arr into smallerMatrix
int counter = 0 ;
int k = 0 ;
for (;k<q;k++){
if(k == i)continue;
smallerMatrix[j][counter] = arr[j+1][k];
counter++;
}
}
int k1 = arr[0][i]*det(q-1, smallerMatrix); //This is the result of determinant of q-1*q-1 matrix
resultOfSubStep += pow(-1,i)*k1; //multiplied by -1 or +1 according to the position of root element
}
return resultOfSubStep;
}
else if(q==2)
{
int d = ((arr[0][0])*(arr[1][1])-(arr[0][1])*(arr[1][0]));
return d;
}
else return arr[0][0];
}
在评论部分,您要求其他方法。在我看来,LU分解是最简单的方法。你可以在LU Decomposition检查它的详细信息。在这种方法中,你必须将给定的矩阵减少到上三角矩阵或下三角矩阵,然后只取对角元素的乘积。所以不需要递归。 希望这会有所帮助。