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

このタスクに最適な BLAS/LAPACK Fortran ライブラリへの C/C++ インターフェイスを使用することをお勧めします。

最初に、O(N!) で複雑に実装した数値メソッド。導入する数値不安定性は言うまでもありません。実際のシステム (常に下で BLAS パッケージを使用する) は、最初に NxN 行列を上/下三角形式に変換し、次に主対角要素の積を見つけることによって問題に取り組みます。

古典的な本「Numerical Recipes」または「Matrix Computations」で参考文献を見つけてください。

于 2012-12-04T05:44:10.937 に答える