begin process at 2008 08 29 22:50:36
1 233 930 membres
450 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

POUR INVERSER UNE MATRICE!


Information sur la source

Catégorie :Maths & Algorithmes Niveau : Initié Date de création : 03/05/2005 Vu : 8 661

Note :
5 / 10 - par 3 personnes
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

c est tout simplement le code pour inverser une matrice (carrée mais est ce la peine de le preciser?) avec le formule théorique, qui à dit qu'elle ne servait à rien?
utile pour ceux qui ont des programmes un tantinet (lol) mathématiques à développer.

Source

  • /*
  • j espere que vous vous rappelez de la formule...
  • calcul de l'inverse de M via la formule théorique
  • */
  • void transp_mat(float ma[max][max],float mb[max][max])
  • {
  • int i,j;
  • for (i=0;i<max;i++)
  • {
  • for (j=0;j<max;j++)
  • {
  • mb[j][i]=ma[i][j];
  • }
  • }
  • }
  • void det_aux(float ma[max][max],float mb[max][max],int l,int c) /*calcul du mineur*/
  • {
  • int i,j,d,e=0;
  • for(i=0;i<max;i++)
  • {
  • d=0;
  • if(i!=l)
  • {
  • for(j=0;j<max;j++)
  • if(j!=c)
  • {
  • mb[e][d]=ma[i][j];
  • d++;
  • }
  • e++;
  • }
  • }
  • }
  • float expo(int n) /*fonction signe*/
  • {
  • if(!(n%2))
  • {
  • return (1);
  • }
  • return (-1);
  • }
  • float determinant(float m[max][max],int l)
  • {
  • int i;
  • float m2[max][max],x=0;
  • if(l==1)
  • {
  • return m[0][0];
  • }
  • for(i=0;i<l;i++)
  • {
  • det_aux(m,m2,i,0);
  • x=x+(expo(i)*m[i][0]*determinant(m2,(l-1)));
  • }
  • return x;
  • }
  • void multi_R(float a,float ma[max][max],float mb[max][max])
  • {
  • int i,j;
  • for(i=0;i<max;i++)
  • {
  • for(j=0;j<max;j++)
  • {
  • mb[i][j]=ma[i][j]*a;
  • }
  • }
  • }
  • void coffacteur(float ma[max][max],float mb[max][max],int l)
  • {
  • int i,j;
  • float m2[max][max];
  • if (l==1)
  • {
  • mb[0][0]=1;
  • }
  • else
  • {
  • for (i=0;i<l;i++)
  • {
  • for (j=0;j<l;j++)
  • {
  • det_aux(ma,m2,i,j);
  • mb[i][j]=expo(i+j)*determinant(m2,(l - 1));
  • }
  • }
  • }
  • }
  • void inverse(float ma[max][max],float mb[max][max],int l)
  • {
  • float m1[max][max],m2[max][max],d;
  • d=(1/determinant(ma,l));
  • coffacteur(ma,m1,l);
  • transp_mat(m1,m2);
  • multi_R(d,m2,mb);
  • }
/*
 j espere que vous vous rappelez de la formule...
 calcul de l'inverse de M via la formule théorique
*/

void transp_mat(float ma[max][max],float mb[max][max])
{
int i,j;
  for (i=0;i<max;i++)
   {
    for (j=0;j<max;j++)
    {
    mb[j][i]=ma[i][j];
    }
   }
}

void det_aux(float ma[max][max],float mb[max][max],int l,int c)      /*calcul du mineur*/
{
 int i,j,d,e=0;
    for(i=0;i<max;i++)
    {
     d=0;
        if(i!=l)
        {
        for(j=0;j<max;j++)
                if(j!=c)
                {
            mb[e][d]=ma[i][j];
            d++;
                }
            e++;
        }
    }
}

float expo(int n)         /*fonction signe*/
{
 if(!(n%2))
  {
   return (1);
  }
 return (-1);
}

float determinant(float m[max][max],int l)
{
int i;
float m2[max][max],x=0;

  if(l==1)
   {
   return m[0][0];
   }
 for(i=0;i<l;i++)
  {
   det_aux(m,m2,i,0);
   x=x+(expo(i)*m[i][0]*determinant(m2,(l-1)));
  }
return x;
}

void multi_R(float a,float ma[max][max],float mb[max][max])
{
int i,j;
for(i=0;i<max;i++)
 {
    for(j=0;j<max;j++)
     {
    mb[i][j]=ma[i][j]*a;
     }
 }
}

void coffacteur(float ma[max][max],float mb[max][max],int l)
{
int i,j;
float m2[max][max];
if (l==1)
{
mb[0][0]=1;
}
 else
 {
  for (i=0;i<l;i++)
  {
    for (j=0;j<l;j++)
    {
    det_aux(ma,m2,i,j);
    mb[i][j]=expo(i+j)*determinant(m2,(l - 1));
    }
  }
 }
}

void inverse(float ma[max][max],float mb[max][max],int l)
{
float m1[max][max],m2[max][max],d;
d=(1/determinant(ma,l));
coffacteur(ma,m1,l);
transp_mat(m1,m2);
multi_R(d,m2,mb);
}

Conclusion


  • signaler à un administrateur
    Commentaire de MetalDwarf le 03/05/2005 18:54:33

    Tu inverses la matrice en utilisant la matrice des cofacteurs?
    Ou la mais c est super lent ca, d ailleurs c est pour ca qu elle ne sert a rien cette formule (enfin si dans plein de problemes mais jamais en pratique).
    La methode du pivot de Gauss est bien plus rapide a l execution, un calcul de determinant c est en O(n!) avec la methode que tu emploies, et donc ton inversion de matrice aussi, alors qu avec le pivot de Gauss c est en O(n^3) ou O(n^4) je ne sais plus

  • signaler à un administrateur
    Commentaire de Taranael le 03/05/2005 22:27:01

    J'ai déposé une classe qui fait la presque totalité des calculs sur les Matrices il y a 4-5 jours et j'ai utilisé cette formule. Et d'ailleurs je n'ai pas eu le culot de le mettre en initié.

  • signaler à un administrateur
    Commentaire de Pindus le 04/05/2005 09:53:16

    metaldwarf, je né jamais pretendu que c était la methode la plus simple...

    taranael, je ne sais pas ce que tu as  mais je te trouve bien aggressif! (arrete le sheba!! lol)

  • signaler à un administrateur
    Commentaire de MetalDwarf le 04/05/2005 10:51:16

    Non, ce n'est pas la methode la plus simple, mais le probleme c est qu elle est tellement lente qu elle devient impraticable.
    Par exemple pour inverser une matrice 20x20 tu vas devoir patienter... patienter... et pour une matrice 70x70 (ce qui est relativement peu) tu n y arriveras jamais (plus de 10^100 operations)...

  • signaler à un administrateur
    Commentaire de Pindus le 04/05/2005 11:25:41

    on est d accord
    mais le fait est que cela marche sans problème
    et puis tu sais je travaille pas pour mathlab! (lol)

  • signaler à un administrateur
    Commentaire de Taranael le 04/05/2005 16:41:57

    J'ai peut-être été un peu agressif mais je déteste que le niveau du code soit surévaluer , et si tu regardes les codes en niveau Initié c'est d'un autre niveau ...
    Sinon j'aime pas le shéba je préfère le Ronron :D

  • signaler à un administrateur
    Commentaire de Arnaud16022 le 04/05/2005 16:47:15

    taranael, je suis entierement d'accord avec toi
    SURTOUT sur le
    "Et d'ailleurs je n'ai pas eu le culot de le mettre en initié."

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS