使用多维数组的递归和动态内存分配来查找NxN矩阵的行列式

时间:2012-12-04 05:37:18

标签: c++ dynamic recursion determinants

我正在尝试编写一个程序,可以计算任何NxN矩阵的行列式,无论大小如何,但程序有问题,并且对于任何大小大于1的矩阵都会崩溃。

我会非常感谢任何能告诉我自己做错事的人。我是c ++和动态内存的新手,所以请把它放在我身上(:。

这是我的计划:

#include <iostream>

using namespace std;

int determinant(int *matrix[], int size);
void ijMinor(int *matrix[], int *minorMatrix[], int size, int row, int column);

int main()
{
    int size;
    cout << "What is the size of the matrix for which you want to find the determinant?:\t";
    cin >> size;

    int **matrix;
    matrix = new int*[size];
    for (int i = 0 ; i < size ; i++)
        matrix[i] = new int[size];

    cout << "\nEnter the values of the matrix seperated by spaces:\n\n";
    for(int i = 0; i < size; i++)
        for(int j = 0; j < size; j++)
            cin >> matrix[i][j];

    cout << "\nThe determinant of the matrix is:\t" << determinant(matrix, size) << endl;

    return 0;
}

int determinant(int *matrix[], int size){
    if(size==1)return matrix[0][0];
    else{
        int result=0, sign=-1;
        for(int j = 0; j < size; j++){

            int **minorMatrix;
            minorMatrix = new int*[size-1];
            for (int k = 0 ; k < size-1 ; k++)
                matrix[k] = new int[size-1];

            ijMinor(matrix, minorMatrix, size, 0, j);

            sign*=-1;
            result+=sign*matrix[0][j]*determinant(minorMatrix, size-1);
            for(int i = 0; i < size-1; i++){
                delete minorMatrix[i];
            }
        }

        return result;
    }
}

void ijMinor(int *matrix[], int *minorMatrix[], int size, int row, int column){
    for(int i = 0; i < size; i++){
        for(int j = 0; j < size; j++){
            if(i < row){
                if(j < column)minorMatrix[i][j] = matrix[i][j];
                else if(j == column)continue;
                else minorMatrix[i][j-1] = matrix[i][j];
            }
            else if(i == row)continue;
            else{
                if(j < column)minorMatrix[i-1][j] = matrix[i][j];
                else if(j == column)continue;
                else minorMatrix[i-1][j-1] = matrix[i][j];
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你的minorMatrix由未经初始化的指针组成:

minorMatrix = new int*[size-1];
for (int k = 0 ; k < size-1 ; k++)
    matrix[k] = new int[size-1];

matrix[k]应为minorMatrix[k]

答案 1 :(得分:0)

最好将C / C ++接口用于BLAS / LAPACK Fortran库,以便在此任务中发挥最佳作用。

首先是你在O(N!)中实现的数值方法的复杂性,更不用说你将要引入的数值不稳定性; 真实世界系统(总是使用下面的BLAS包)通过首先将NxN矩阵转换为上/下三角形,然后找到主对角元素的乘积来解决问题。

在经典书籍'Numerical Recipes'或'Matrix Computations'中查找参考文献。