0

我正在尝试编写一个程序,该程序可以计算任何 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];
            }
        }
    }
}
4

2 回答 2

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]

于 2012-12-04T05:55:25.957 回答
0

您最好使用 C/C++ 接口连接到 BLAS/LAPACK Fortran 库,这些库在此任务中做得最好。

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

在经典书籍“数值食谱”或“矩阵计算”中查找参考资料。

于 2012-12-04T05:44:10.937 回答