Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3044 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

inversion matricielle

n°1090983
Elmoricq
Modérateur
Posté le 20-05-2005 à 16:57:10  profilanswer
 

Reprise du message précédent :
De toute façon, même sans %e manquant, c'est horrible de faire comme ça.
Horrible question élégance, mais aussi (et surtout) parce que c'est casse-gueule.
Aucun contrôle d'erreur, possibilité d'obtenir absolument ce qu'on veut...
 
Mieux vaut un bon vieux fgets() et on travaille sur la chaîne lue à partir de là.

mood
Publicité
Posté le 20-05-2005 à 16:57:10  profilanswer
 

n°1091004
skelter
Posté le 20-05-2005 à 17:13:42  profilanswer
 

ben ouai, fgets + strtod

n°1091446
el muchach​o
Comfortably Numb
Posté le 21-05-2005 à 07:53:48  profilanswer
 

nicosmos a écrit :

bon effectivement je n ai pas suivi les instructions, donc honte a moi!!
effectivement ce n est pas du c++ mais bien du C, enfin, si je comprends bien que le C++ est de la prog orienté objet??
le prog tourne quand meme mais avec une initialisation par "random"de la matrice.
  je dois avoir un problem sur la lecture du fichier contenant les valeurs numeriques. j utilise "fscanf".j'affiche bien les valeurs de la matrice a inverser mais lorsque je l inverse elle me sort des nan nan...
PS : j ai corrigé le %e qui manquait a l appel.
voila.
 
merci


 
C'est normal, tu passes tout sur la pile (de plus, ta syntaxe me parait louche, ça ne peut pas compiler comme ça), elle explose. Le C est chouillas plus sophistiqué que le Pascal au niveau gestion mémoire. Il y a déjà eu une explication à ce sujet sur le forum. Fais une recherche sur "pile tas".


Message édité par el muchacho le 21-05-2005 à 07:55:32
n°1095293
chicotruss
Posté le 24-05-2005 à 17:04:47  profilanswer
 

nicosmos a écrit :

Bonjour,
j aai essayé Gauss jordan mais sans réel succès!!


 
La methode de Gauss necessite de prendre quelques précautions sinon elle renvoid des résultats completements faux.
De mémoire, il faut que le pivot soit une valeur la plus grande possible, ce qui implique des inversions de lignes et|ou colonnes au préalable.
 
Perso, j'utilise la methode de Cramer (seule restriction, le determinant ne doit pas etre nul), par contre c'est beaucoup plus long pour des matrices de taille a partir de 9x9 (sur mon implémentation)
 
pour les formules par exemple: http://membres.lycos.fr/emauvais/idm/MatOpe.htm
 

n°1096805
nicosmos
Posté le 25-05-2005 à 15:43:53  profilanswer
 

Elmoricq a écrit :

De toute façon, même sans %e manquant, c'est horrible de faire comme ça.
Horrible question élégance, mais aussi (et surtout) parce que c'est casse-gueule.
Aucun contrôle d'erreur, possibilité d'obtenir absolument ce qu'on veut...
 
Mieux vaut un bon vieux fgets() et on travaille sur la chaîne lue à partir de là.


 
 
oui mais un fgets est pour une chaine de caractere et là, j'ai des nombres positif ou negatifs, donc pas le meme nombre d'octets.
quel controle est ce que je peux mettre? je veux bien en mettre!!

n°1096818
nicosmos
Posté le 25-05-2005 à 15:48:29  profilanswer
 

chicotruss a écrit :

La methode de Gauss necessite de prendre quelques précautions sinon elle renvoid des résultats completements faux.
De mémoire, il faut que le pivot soit une valeur la plus grande possible, ce qui implique des inversions de lignes et|ou colonnes au préalable.
 
Perso, j'utilise la methode de Cramer (seule restriction, le determinant ne doit pas etre nul), par contre c'est beaucoup plus long pour des matrices de taille a partir de 9x9 (sur mon implémentation)
 
pour les formules par exemple: http://membres.lycos.fr/emauvais/idm/MatOpe.htm


 
je ne suis pas avard en temps, je veux bien essayé autre chose??
est ce que tu as un source avec la methode de cramer en C ??
merci

n°1096896
chicotruss
Posté le 25-05-2005 à 16:30:51  profilanswer
 

nicosmos a écrit :

je ne suis pas avard en temps, je veux bien essayé autre chose??


 
Je precise quand meme que dans la cas d'une matrice 10x10 de float ca prend environ 1min sur un 3GHZ l'inversion par Cramer.
 

Citation :

est ce que tu as un source avec la methode de cramer en C ??


 
En C non mais je peu te mettre les formules de math, c'est recursif et ca passe tout seul
 

Code :
  1. pour une matriice carrée uniquement
  2. Si determinant(matrice originale) != 0
  3. alors c'est inversible
  4. matrice inverse = transposee(comatrice(matrice originale)) / determinant(matrice originale) //division terme à terme
  5. transposee:
  6. boucle sur tous les elemnents de la matrice
  7. element(i, j) devient element(j, i) dans la matrice transposee
  8. comatrice:
  9. pour chaque element(i, j) de la matrice originale correspond un cofacteur(i, j) = (-1)^(i+j) * determinant(mineur(i, j))
  10. avec i et j commencant à 1 donc si i et j commencent à 0 tu remplace (-1)^(i+j) par (-1)^(i+j+2) (mais bon c'est juste au niveau logique, ca change rien au resultat)
  11. mineur:
  12. mineur(i, j) = matrice sans les lignes i et j
  13. determinant:
  14. somme pour j fixé quelconque (1 par exemple) de((-1)^(i+j) * determinant(mineur(i, j)) * element(i, j))
  15. avec i et j commencant à 1
  16. donc recursif -> condition d'arret: quand nb_lignes (= nb_colonnes) = 2 -> alors determinant = element(1, 1)*element(2, 2) - element(2, 1)*element(1, 2)
  17. Attention (-1)^(i+j) signifie (-1) puissance (i+j) et pas (-1) * 10 puissance (i+j)
  18. -> cela dit, pour optimiser tu dois pouvoir remplacer par (((i+j)&0x01)?(-1):(1))
  19. -> voila, ca passe tout seul si tu fais une classe avec ces methodes


Message édité par chicotruss le 26-05-2005 à 09:46:28
n°1096940
skelter
Posté le 25-05-2005 à 16:47:51  profilanswer
 

nicosmos a écrit :

oui mais un fgets est pour une chaine de caractere et là, j'ai des nombres positif ou negatifs, donc pas le meme nombre d'octets.


 
on a dis fgets + strtol (ou strtod)

n°1102375
cat steven​s
Posté le 31-05-2005 à 01:19:06  profilanswer
 

dnner moi le programme en c du calcul de l'inverce d'une matrice  
merci

n°1102376
push
/dev/random
Posté le 31-05-2005 à 01:23:38  profilanswer
 

cat stevens a écrit :

dnner moi le programme en c du calcul de l'inverce d'une matrice  
merci


et un mars dans le cul avec ça ?

mood
Publicité
Posté le 31-05-2005 à 01:23:38  profilanswer
 

n°1102377
cat steven​s
Posté le 31-05-2005 à 01:24:25  profilanswer
 

connassez vous la methode gausse seideel

n°1104873
nicosmos
Posté le 02-06-2005 à 09:44:36  profilanswer
 

cat stevens a écrit :

connassez vous la methode gausse seideel


non je ne connais pas, dis m en plus...
je suis toujours  la recherche d un code d 'inversion de matrice n*n qui fonctionne.
voil la fonction que j utilise mais qui ne fonctionne pas;je l ai faite a partir d un source en pascal mais ici il y  un soucis de division par zero.  

Code :
  1. void
  2. invers(double a[nmax][nmax])
  3. {
  4.   int k,j,i;
  5.   double b[nmax][nmax],tot;
  6.   for (k=0;k<nmax;k++)
  7.     {
  8.       for(j=0;j<nmax;j++)
  9. b[k][j]=0;
  10.       b[k][k]=1;
  11.     }
  12.   // b est initialisé a la matrice identité  
  13.  
  14.  
  15.   for (k=0;k<nmax;k++)
  16.     {
  17.       tot=a[k][k];
  18.      
  19.       for(j=0;j<nmax;j++)
  20. { a[k][j]=a[k][j]/tot;
  21. b[k][j]=b[k][j]/tot;
  22. }
  23.       for (i=0;i<nmax;i++)
  24. {
  25.   if (i!=k)
  26.     {
  27.       tot=a[i][k];
  28.      
  29.       for (int j=0;j<nmax;j++)
  30.  {
  31.    a[i][j]=a[i][j]-tot*a[k][j];
  32.    b[i][j]=b[i][j]-tot*b[k][j];
  33.    }
  34.     }
  35. }
  36.     }
  37.   //on inverse la matrice
  38.   for(int z=0;z<nmax;z++)
  39.   {
  40.     for (int s=0;s<nmax;s++)
  41.       a[z][s]=b[z][s];
  42.   }
  43. }

n°1104893
nicosmos
Posté le 02-06-2005 à 09:53:14  profilanswer
 

push a écrit :

et un mars dans le cul avec ça ?


je crois bien que si c est pour faire ce genre de reflexion tu peux ne rien faire ce sera mieux.
par contre si tu deviens constructif et que tu me trouves un prog d'inversion matricielle en C pour des matrice de rang n>100 ... je te serais reconnaissant...
si je suis sur ce forum c est quand meme pour que l on m'aide.
d'ailleurs je suis sur l inversion matricielle des numerical recipices et je n'arrive pas a compiler leur inversion gauss jordan... si...
bref
merci
nico

n°1105236
blastman
just me !
Posté le 02-06-2005 à 12:25:51  profilanswer
 

nicosmos a écrit :

je crois bien que si c est pour faire ce genre de reflexion tu peux ne rien faire ce sera mieux.
par contre si tu deviens constructif et que tu me trouves un prog d'inversion matricielle en C pour des matrice de rang n>100 ... je te serais reconnaissant...
si je suis sur ce forum c est quand meme pour que l on m'aide.
d'ailleurs je suis sur l inversion matricielle des numerical recipices et je n'arrive pas a compiler leur inversion gauss jordan... si...
bref
merci
nico


 
tu acceptera son mars  :D


---------------
http://www.blastmanu.info
n°1105454
nicosmos
Posté le 02-06-2005 à 15:02:01  profilanswer
 

blastman a écrit :

tu acceptera son mars  :D


...

n°1105459
blastman
just me !
Posté le 02-06-2005 à 15:05:12  profilanswer
 

ça veut dire oui ?
 
vas y push trouve lui un prog. d'inversion matricielle en C pour des matrice de rang n>100 comme ça tu aura son autorisation pour le sodomiser
 
fouette le de ma part
 
 :lol:


Message édité par blastman le 02-06-2005 à 15:38:55

---------------
http://www.blastmanu.info
n°1105528
nicosmos
Posté le 02-06-2005 à 15:22:58  profilanswer
 

...

n°1110995
FrenchFrog​ger
http://antony-ibanez.eg2.fr/
Posté le 07-06-2005 à 13:25:28  profilanswer
 

nicosmos a écrit :

non je ne connais pas, dis m en plus...
je suis toujours  la recherche d un code d 'inversion de matrice n*n qui fonctionne.
voil la fonction que j utilise mais qui ne fonctionne pas;je l ai faite a partir d un source en pascal mais ici il y  un soucis de division par zero.  

Code :
  1. .....
  2.   for (k=0;k<nmax;k++)
  3.     {
  4.       for(j=0;j<nmax;j++)
  5. b[k][j]=0;
  6.       b[k][k]=1;       // Aucune erreur ici, mais je pense que tu peux optimiser ces instructions...
  7.     }
  8.       .....
  9.  
  10.   for (k=0;k<nmax;k++)
  11.     {
  12.       tot=a[k][k];    // tot peut donc être égal à 0?
  13.      
  14.       for(j=0;j<nmax;j++)
  15. { a[k][j]=a[k][j]/tot;     // Si tot = 0, ça coince...
  16. b[k][j]=b[k][j]/tot;
  17. }
  18.       ......



 

Code :
  1. Pour inverser une matrice, si l'on parle de la même chose, j'ai vu cette méthode:
  2. A = (e1 e2) matrice dont ont connait la valeur des n*n membres.
  3.     (e3 e4)
  4. B = inverse de A =
  5. (x1)   si A a n*n éléments, cette matrice doit avoir 1*n variables (x1,...,xn)
  6. (x2)   (en fait elle en a n*n éléments mais on verra plus tard)
  7. Puisque B est l'inverse de A,
  8. A*B = B*A = (y1)  on s'enfout des valeurs de y1 et y2...
  9.             (y2)
  10. Donc A*B = (x1*e1 + x2*e2)  = (y1)   =>  x1*e1 + x2*e2 = y1
  11.            (x1*e3 + x2*e4)  = (y2)   =>  x1*e3 + x2*e4 = y2
  12. Puis, par exemple, si e1 = 2, e2 = 3, e3 = -2, e4 = 9, on a:
  13. 2 * x1 + 3 * x2 = y1     => y1 + y2 = 12 * x2
  14. -2 * x1 + 9 * x2 = y2    => 3 * y1 - y2 = 4 * x1
  15. => x1 = 3/4 * y1 - 1/4 * y2             =>  B = ( 3/4  -1/4 )
  16.    x2 = 1 / 12 * y1 + 1 / 12 * y2               ( 1/12 1/12 )


 
Je sais pas si tu as compris...


Message édité par FrenchFrogger le 07-06-2005 à 13:27:31

---------------
http://antony-ibanez.eg2.fr/
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
inversion de liste chaineInversion de couleurs [Résolu]
[algo] inversion d'une matrice, cas "particulier"Produit de 2 matrices de format différent et inversion de matrice
Plus de sujets relatifs à : inversion matricielle


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)