我正在尝试编写一个程序,该程序可以计算任何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:nn";
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];
}
}
}
}
您的minorMatrix
由未初始化的指针组成,因此:
minorMatrix = new int*[size-1];
for (int k = 0 ; k < size-1 ; k++)
matrix[k] = new int[size-1];
matrix[k]
应该是minorMatrix[k]
.
你最好使用 C/C++ 接口来访问 BLAS/LAPACK Fortran 库,这些库在这项任务中做得最好。
首先是你在 O(N!) 中实现的复杂度数值方法,更不用说你将引入的数值不稳定性;现实世界的系统(总是在下面使用 BLAS 包)通过首先将 NxN 矩阵转换为上/下三角形形式,然后找到主对角线元素的乘积来解决问题。
在经典书籍"数值配方"或"矩阵计算"中查找参考资料。