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.
Version imprimable
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.
peut tu nous le montré ?
ok,
Voila!Code:
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); }
Comment est déclarée mat dans un appel invert_mat( mat, len_i) ?
oui c ca
[code]invert_mat(A,len);[\code]
:aie: toujours le plus simple est le plus efficaceCode:
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(); } ]
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 ?
Ceci calcule la transposée pas l'inverse, non?Code:
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];}
oui tout a fait c'est l'inverse de la matrice :lol: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.
Citation:
Envoyé par Trap D
les matrices sont en effet allouees dynamiquement
Code:
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:double **mat; make_mat(&mat,3,3);
Une remarque:
peut s'écrire:Code:*pmat = (double **)malloc(len_i*sizeof(double *));
Code:*pmat =malloc(len_i*sizeof(**pmat));
C note ;)
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.Citation:
Envoyé par seriousme
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. :D
Il me semble que dans ce cas là on parle de transposition, c'est tout.Citation:
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.
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 ;)
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).Citation:
Envoyé par babycrash
Citation:
Envoyé par Jean-Marc.Bourguet
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.