2012-12-04 1 views
0

J'essaye d'écrire un programme qui peut calculer le déterminant de n'importe quelle matrice NxN indépendamment de la taille mais il y a quelque chose de mal avec le programme se bloque pour toute matrice avec une taille supérieure à 1.Utilisation de la récursivité et allocation dynamique de mémoire de tableaux multidimensionnels pour trouver le déterminant d'une matrice NxN

Je serais très reconnaissant à tous ceux qui peuvent me dire ce que je fais mal. Je suis nouveau à C++ et de la mémoire dynamique ainsi, prendre facile sur moi s'il vous plaît (:.

Voici mon programme:

#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]; 
      } 
     } 
    } 
} 
+1

Je suggère d'abord de refactoring pour utiliser [std :: vector] (http://www.cplusplus.com/reference/vector/vector/), au lieu de tableaux basés sur la mémoire dynamique, pour éliminer le besoin de 'nouveau' et 'delete'. –

+0

Toujours utiliser 'delete []' quand vous avez fait 'new []'. – molbdnilo

+0

Merci pour l'aide .. Le programme fonctionne maintenant – theintegral

Répondre

0

Vous feriez mieux d'utiliser les interfaces C/C++ pour BLAS/LAPACK Fortran

D'abord la méthode numérique que vous avez implémentée dans O (N!) en complexité, sans parler des instabilités numériques que vous allez introduire: les systèmes du monde réel (qui utilisent invariablement les paquets BLAS) dessous) aborde le problème en convertissant d'abord la matrice NxN en une forme triangulaire supérieure/inférieure, puis en trouvant le p produit des éléments diagonaux principaux.

Trouvez des références dans les livres classiques «Recettes numériques» ou «Calcul matriciel».

+0

Merci pour l'aide et les références. Je ne suis qu'un débutant en programmation, alors j'essayais juste de tester ma compréhension de la tâche. Je n'essayais pas d'écrire le programme le meilleur ou le plus efficace pour trouver le déterminant. Néanmoins, merci beaucoup et je suis sûr que je trouverai les références que vous m'avez fournies très utiles. – theintegral

1

Votre minorMatrix se compose de pointeurs non initialisées à cause de cela:

minorMatrix = new int*[size-1]; 
for (int k = 0 ; k < size-1 ; k++) 
    matrix[k] = new int[size-1]; 

matrix[k] devrait être minorMatrix[k].

+0

Merci beaucoup l'homme. Cela a fait l'affaire. C'est ce qui arrive quand vous copiez et collez sans vous assurer que vous avez changé toutes les variables. – theintegral

Questions connexes