Calcul de determinant d'une matrice

Soyez le premier à donner votre avis sur cette source.

Snippet vu 70 149 fois - Téléchargée 30 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

le_duche
Messages postés
164
Date d'inscription
lundi 13 juin 2005
Statut
Membre
Dernière intervention
26 février 2009
-
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;
}
le_duche
Messages postés
164
Date d'inscription
lundi 13 juin 2005
Statut
Membre
Dernière intervention
26 février 2009
-
C'est issu de ma source sur les matrices qui est sur ce site
souidina
Messages postés
4
Date d'inscription
lundi 12 mars 2007
Statut
Membre
Dernière intervention
17 juillet 2008
-
merci le code a bien marché

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)