Я пытаюсь написать программу, которая может вычислить определитель любой матрицы 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];
}
}
}
}
Ваш 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 в верхнюю / нижнюю треугольную форму, а затем находя произведение главных диагональных элементов.
Найдите ссылки в классических книгах «Численные рецепты» или «Матричные вычисления».