具有递归的矩阵的行列式

时间:2017-10-03 12:50:29

标签: c arrays recursion determinants

下面的代码递归地计算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;
    }
}

1 个答案:

答案 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检查它的详细信息。在这种方法中,你必须将给定的矩阵减少到上三角矩阵或下三角矩阵,然后只取对角元素的乘积。所以不需要递归。 希望这会有所帮助。