Использование рекурсии и динамическое распределение памяти многомерных массивов для определения определителя матрицы NxN

Я пытаюсь написать программу, которая может вычислить определитель любой матрицы 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

Решение

Ваш 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

Другие решения

Вам лучше использовать интерфейсы C / C ++ для библиотек BLAS / LAPACK Fortran, которые лучше всего справляются с этой задачей.

Сначала сложный численный метод, который вы реализовали в O (N!), Не говоря уже о числовой нестабильности, которую вы представите;
системы реального мира (которые неизменно используют пакеты BLAS внизу) подходят к этой проблеме, сначала конвертируя матрицу NxN в верхнюю / нижнюю треугольную форму, а затем находя произведение главных диагональных элементов.

Найдите ссылки в классических книгах «Численные рецепты» или «Матричные вычисления».

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector