IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

inversion de matrice?


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut inversion de matrice?
    Bonjour,

    Je cherche une nouvelle methode pour inverser une matrice.

    J'utilise actuellement la methode de Gauss-Jordan mais elle donne regulierement des erreurs.

    Si vous voulez je peux vous joindre le code.

  2. #2
    Rédacteur
    Avatar de pi-2r
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2006
    Messages
    1 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 486
    Points : 2 440
    Points
    2 440
    Par défaut
    peut tu nous le montré ?
    Les pièges de l'Internet
    Helix, réponse à une intrusion


    "La plus grande gloire n'est pas de ne jamais tomber, mais de se relever à chaque chute." Confucius
    "Si j'ai vu plus loin, c'est en me tenant sur les épaules de géants." Isaac Newton

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut ok!
    ok,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    void invert_mat( double **  mat, register int len_i)
    {
    	int i,j,k;
    	double val;
    	make_mat( &mat2, len_i, 2*len_i);
     
    	for(i=0; i<len_i; i++)
    	{
    		for(j=0; j<2*len_i; j++)
    		{
    			if (j<len_i) mat2[i][j]=mat[i][j];
    			else if(i==(j-len_i)) mat2[i][j]= 1;
    			else mat2[i][j]=0;
    		}
    	}
     
    	for(i=0; i<len_i; i++) // ligne
    	{
    		for(j=0; j<2*len_i; j++) mat2[i][j]=mat2[i][j]/mat2[i][i];
    		for(j=0; j<len_i; j++)
    		{
    			if(j!=i)
    			{
    				val = mat2[j][i];
    				for(k=0; k<2*len_i; k++)
    					mat2[j][k] = mat2[j][k] - val * mat2[i][k];
    			}
    		}
    	}
     
     
    	for(i=0; i<len_i; i++)
    		for(j=0; j<len_i; j++) mat[j][i]=mat2[j][i+len_i];
     
    	//free_mat(mat2,len_i,2*len_i);
    }
    Voila!

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Comment est déclarée mat dans un appel invert_mat( mat, len_i) ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    oui c ca

    [code]invert_mat(A,len);[\code]

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    include <stdio.h>
    #include <conio.h>
    void main (){
    int a[3][4];
    int x[4][3];
    int sum=0;
    //-------------------- input ------------------------
    printf("\t\t\t  OMAR ABO MAILEQ\n\t\t\t DEALINT WITH ARRAY\n\t\t\tQUDS OPEN UNVERSITY\n");
    for (int i=0;i<3;i++)
    	{
       printf("Enter four values: \n");
       	for (int j=0;j<4;j++)
          	scanf("%d",&a[i][j]);
             }
       printf("\n\n");
             //-------------------- output ------------------------
     
       printf("THE ARRAY VALUS YOU INTERD: \n");
       for (int i=0;i<3;i++)
    	{
    	for (int j=0;j<4;j++)
       printf("%d\t",a[i][j]);
    	printf("\n");}
    //-------------------- sum ---------------------------
    for (int i=0;i<3;i++)
    	{
    	for (int j=0;j<4;j++)
       	sum+=a[i][j];}
    printf("\nSUM OF ELEMENTS IS: %d\n\n",sum);
    //-------------------- make oposit -------------------
    for (int i=0;i<4;i++)
    	{  for (int j=0;j<3;j++)
       		x[i][j]=a[j][i];}
    //---------------------- output again ----------------
    printf("\nNOW WE SWITCH THE ROWS & COLOMONS\n");
    for (int i=0;i<4;i++)
    	{
    	for (int j=0;j<3;j++)
       printf("%d\t",x[i][j]);
    	printf("\n");}
    //-----------------------------------------------------
    printf(" \n\n\t\t\tPRESS ANY KEY TO EXIT...");
    getch();
     
    }
    ]
    toujours le plus simple est le plus efficace

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Non, ce que je veux dire, mat est-elle allouée par un malloc ou définie sous la forme int mat[3][3] par exemple ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //-------------------- make oposit -------------------
    for (int i=0;i<4;i++)
    	{  for (int j=0;j<3;j++)
       		x[i][j]=a[j][i];}
    Ceci calcule la transposée pas l'inverse, non?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par seriousme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //-------------------- make oposit -------------------
    for (int i=0;i<4;i++)
    	{  for (int j=0;j<3;j++)
       		x[i][j]=a[j][i];}
    Ceci calcule la transposée pas l'inverse, non?
    oui tout a fait c'est l'inverse de la matrice

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Une méthode est de diviser par le déterminant de la matrice la transposée de la matrice des cofacteurs.
    Les calculs sont simples mais ce n'est peut être pas trés efficace.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut desole pour cette absence
    Citation Envoyé par Trap D
    Non, ce que je veux dire, mat est-elle allouée par un malloc ou définie sous la forme int mat[3][3] par exemple ?

    les matrices sont en effet allouees dynamiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     void make_mat( double ***pmat, int len_i, int len_j)
    {
    	int i;
    	*pmat = (double **)malloc(len_i*sizeof(double *));
    	for(i=0;i<len_i;i++)
    	{
    		make_vect(&((*pmat)[i]),len_j);
    	}
    }

    et l'appel se fait sous cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     double **mat; make_mat(&mat,3,3);

  12. #12
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Une remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *pmat = (double **)malloc(len_i*sizeof(double *));
    peut s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *pmat =malloc(len_i*sizeof(**pmat));
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    C note

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par seriousme
    Une méthode est de diviser par le déterminant de la matrice la transposée de la matrice des cofacteurs.
    Les calculs sont simples mais ce n'est peut être pas trés efficace.
    C'est mon premier module au langage c a la faculte . Parmi les choses que l'on avait appris au tout debut c'est la simplicite de l'algoritme, d'ou la simplicite du code est requise.
    Le code de l'inversion de la matrice a ete fait par un collegue. Je ne vois pas ou est le probleme puisqu'il est claire que ca demande de remplacer les rangs par les colonnes et vis vers ca.

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je ne vois pas ou est le probleme puisqu'il est claire que ca demande de remplacer les rangs par les colonnes et vis vers ca.
    Il me semble que dans ce cas là on parle de transposition, c'est tout.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  16. #16
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut attention aux abus de langage
    Bonjour,

    Je tenais a preciser je cherche bien a inverser une matrice (mat^-1) et non pas a la transposer. L'inversion de matrice est un pb outrement plus complexe que le transposition (fonction par ailleurs que j'ai deja realisee).

    Pourrait on m'aider sur ce point?

    Merci a tous ceux qui font vivre cette discussion

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par babycrash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		for(j=0; j<2*len_i; j++) mat2[i][j]=mat2[i][j]/mat2[i][i];
    Voila!
    Que devient mat2[i][i] quand i == j? Est-ce que le reste des calculs pour cette ligne est correct? (A mon avis, non, et c'est là ton problème).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  18. #18
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Que devient mat2[i][i] quand i == j? Est-ce que le reste des calculs pour cette ligne est correct? (A mon avis, non, et c'est là ton problème).

    je n'ai effectivement pas cherche a debugger ce code aucune idee en fait de ce que deviens mat2[i][j] qd i==j?
    ce que je sais est que le pgm fonctionne mais me donne des resultats aberrants

    Si l'erreur se trouve la comment puis je la corrigee?

    Merci, Pierre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment inverser une matrice (array)
    Par bonomsoleil dans le forum C
    Réponses: 7
    Dernier message: 10/11/2006, 20h53
  2. Inversion de matrice
    Par mhooreman dans le forum Mathématiques
    Réponses: 6
    Dernier message: 26/10/2006, 18h35
  3. Probleme d'inversion de matrice subtil
    Par babycrash dans le forum C
    Réponses: 2
    Dernier message: 02/08/2006, 17h41
  4. Comment inverser une matrice H(2,2) ?
    Par fafa624 dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 10h23
  5. Calculer un inverse de matrice avec boost?
    Par Clad3 dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 02/06/2005, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo