我正在尝试编写一个程序,可以计算任何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];
}
}
}
}
答案 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'中查找参考文献。