Calcul de determinant d'une matrice

0/5 (3 avis)

Snippet vu 78 958 fois - Téléchargée 32 fois

Contenu du snippet

Algorithme qui calcul le determinant d'une matrice carrée.

Notation: une matrice A(i,j) de dimension dim*dim s'ecrit :
A[i+j*dim]

La fonction det est la fonction qui renoive la determinant d'une matrice. elle utilise la fonction lmatrice qui calcul le cofacteur de la matrice pour la ligne n et la colone l. la fonction det utilise le principe de recursivité

Source / Exemple :


#include <iostream>
#include <cmath>
using namespace std;

void lmatrice(double mat[],double lmat[], int n, int l);
double det(double mat[], int n);

int main()
{
//exemple d'utilisation pour une matrice 2x2
 int dim=2;
 double *M=new double[dim*dim];
//remplissage de la matrice M
 M[0+0*dim]=2.;
 M[0+1*dim]=4.8;
 M[1+0*dim]=6.2;
 M[1+1*dim]=5.1;
//determinant de la matrice M
 double resultat;
 resultat=det(M,dim);
//affichage du resultat
 cout<<resultat<<endl;
}

void lmatrice(double mat[],double lmat[], int n, int l)
{
 int ld=0;
 int k=n-1;
 for(int i=0;i<n;i++)
 {
  if(i!=l)
  {
   for(int j=1;j<n;j++)
   {
    lmat[ld+(j-1)*k]=mat[i+j*n];
   }
    ld++;
  }
 }
}

double det(double mat[], int n)
{
 double resultat;
 resultat=0.;
 int k=n-1;
 double signe;
 signe=1.;
 double *lmat=new double[k*k];
 if(n==1)
 {
  return mat[0];
 }
 for(int i=0;i<n;i++)
 {
  lmatrice(mat,lmat,n,i);
  resultat=resultat+signe*mat[i]*det(lmat,k);
  signe=-signe;
 }
 return resultat;
 delete(lmat);
}

Conclusion :


// Karim Hasnaoui
// GRAND ACCELERATEUR NATIONAL D'IONS LOURDS,
// Boulevard Henri Becquerel,
// B.P. 55027, 14076 CAEN Cedex, France
// bureau 282
// E-mail: Hasnaoui@ganil.fr
// tel: 0033 (0)2 31 45 49 25

A voir également

Ajouter un commentaire Commentaires
souidina Messages postés 4 Date d'inscription lundi 12 mars 2007 Statut Membre Dernière intervention 17 juillet 2008
15 juil. 2008 à 13:57
merci le code a bien marché
le_duche Messages postés 159 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 26 février 2009
21 févr. 2006 à 19:14
C'est issu de ma source sur les matrices qui est sur ce site
le_duche Messages postés 159 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 26 février 2009
21 févr. 2006 à 19:12
essaye plutot ceci:

double MatriceCarree::det()
{
MatriceCarree a(*this);
double prod = 1.0;
for(int i=0;i<nbrL;i++)
{
int max = i;
for(int j=i+1;j<nbrL;j++)
if(fabs(a.p[j*nbrC+i]) > fabs(a.p[max*nbrC+i]))
max = j;
if(fabs(a.p[max*nbrC+i]) < epsilon)
return 0.0;
if(i != max)
prod *= -1;
for(int k=i;k<nbrC;k++)
swap(a.p[i*nbrC+k],a.p[max*nbrC+k]);
for(int j=i+1;j<nbrL;j++)
{
double coef = a.p[j*nbrC+i]/a.p[i*nbrC+i];
for(int k=nbrC-1;k>=i;k--)
a.p[j*nbrC+k] -= coef*a.p[i*nbrC+k];
}
}
for(int i=0;i<nbrL;i++)
prod *= a.p[i*nbrC+i];
if(fabs(prod) < epsilon)
return 0.0;
else
return prod;
}

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (hasnaoui_karim)