Cześć,
Chodzi o obliczanie wyznacznika metodą Laplance'a korzystając z rekurencji i to właśnie gdzieś przy niej mi coś nie hula.
Nie mogę za cholerę zlokalizować co jest nie tak więc postanowiłem ruszyć na forum.
Dla testowej macierzy:
1 2
3 4
zwraca mi wynik -3
Siedziałem trochę i debugowałem program i zauważyłem, że funkcja wywołuje samą siebie dwukrotnie, a powinna przecież tylko raz bo po pierwszym wywołaniu już podmacierz ma tylko 1 element.
Wygląda to tak, że wywoływana jest funkcja obliczająca macierz po raz pierwszy w main, następnie wywołuje samą siebie w tej linijce:
det += mul * matrix[subMatrixRow][columnsVector[i]] * determinant(sizeMatrix - 1, subMatrixRow + 1, columnsVectorToCalc, matrix);
Po wywołaniu, det = 4
, następnie program dochodzi do if'a no i wykonuje:
return matrix[subMatrixRow][0];
po czym
det = 3
no i później zmienia się mnożnik na -1
i program jeszcze raz wykonuje funkcję, znowu zwraca 3, mnoży prze wartość -1</code> i mam <code>-3
.
Nie wiem co jest nie tak.
#include <iostream>
using namespace std;
//wyznacznik macierzy, deklaracja
int determinant(int **matrix, int sizeMatrix, int *columnsVector, int subMatrixRow);
int main(){
int sizeMatrix = 0; //rozmiar macierzy
int var = 0;
cout << "Podaj stopien macierzy: " << endl;
cin >> sizeMatrix;
int **matrix = new int *[sizeMatrix]; //dynamiczna alokacja miejsca na macierz
//for(int i = 0; i < sizeMatrix; i++)
//uzupelniamy macierz zmiennymi wprowadzonymi z klawiatury
cout << "Uzupelnianie macierzy" << endl;
for(int row = 0; row < sizeMatrix; row++){
matrix[row] = new int[sizeMatrix]; //tworzymy macierz o wybranym rozmiarze
for(int column = 0; column < sizeMatrix; column++){
cin >> matrix[row][column];
}
}
int *columnsVector = new int[sizeMatrix]; //wektor kolumn w macierzy
for(int i = 0; i < sizeMatrix; i++) //wypelniamy go numerami kolumn
columnsVector[i] = i;
cout << "Wyznacznik to: " << determinant(matrix, sizeMatrix, columnsVector, 0) << endl;
//zwalniamy pamiec
delete [] columnsVector;
for(int i = 0; i < sizeMatrix; i++)
delete [] matrix[i];
delete [] matrix;
return 0;
}
int determinant(int **matrix, int sizeMatrix, int *columnsVector, int subMatrixRow){
int *columnsVectorToCalc; //wektor kolumn z wykreslona kolumna, do obliczen
int det; //wyznacznik
int mul = 1; //mnoznik
int colVector = 0; //wektor kolumny ktora pominiemy
if(sizeMatrix == 1){
//jezeli macierz ma tylko jeden element to on jest jej wyznacznikiem
return matrix[subMatrixRow][0];
}
else{
columnsVectorToCalc = new int[sizeMatrix - 1];
det = 0;
for(int i = 0; i < sizeMatrix; i++){
for(int j = 0; j < sizeMatrix - 1; j++){
if(colVector == i) //jezeli rowne to pomijamy biezaca kolumne
colVector++;
columnsVectorToCalc[j] = columnsVector[colVector++]; //a tu wrzucamy reszte
}
det += mul * matrix[subMatrixRow][columnsVector[i]] * determinant(matrix, sizeMatrix - 1, columnsVectorToCalc, subMatrixRow + 1);
mul = -mul;
}
delete [] columnsVectorToCalc;
return det;
}