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

  FORUM HardWare.fr
  Programmation
  C++

  inversion matricielle

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

inversion matricielle

n°1088030
nicosmos
Posté le 18-05-2005 à 15:46:28  profilanswer
 

Bonjour,
j ai un probleme avec une inversion matricielle en C++ d une matrice carré de 32 par 32.
j aai essayé Gauss jordan mais sans réel succès!!
est ce que quelqu un a un prog qui tourne
je suis sur linux.
merci

mood
Publicité
Posté le 18-05-2005 à 15:46:28  profilanswer
 

n°1088043
tomtom41
It's not a bug, it's a feature
Posté le 18-05-2005 à 15:52:05  profilanswer
 

quel est le problème :??:


Message édité par tomtom41 le 18-05-2005 à 15:52:19
n°1088052
Elmoricq
Modérateur
Posté le 18-05-2005 à 15:55:17  profilanswer
 

nicosmos a écrit :

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


 
Mais encore ? :heink:

n°1088099
nicosmos
Posté le 18-05-2005 à 16:12:24  profilanswer
 

voila ma procedure d inversion  
j ai mis du pascal en C
je lit dans un fichier txt des valeurs numerique: matrice 32 par 32 et j'essaie d'inverser . le seul affichage que j ai est nan nan nan...  
 
 
void invers(float a[nmax][nmax])
{
int k,j,i,x,q;
float b[nmax][nmax],tot;
 
for (k=0;k<nmax;k++)
 {
  for(j=0;j<nmax;j++)  
  b[k][j]=0;
         b[k][k]=1;
 }
 
// b est initialisé a la matrice identité  
 
 
for (k=0;k<nmax;k++)
 {    
 tot=a[k][k];
 
 for(j=0;j<nmax;j++)
  {
  a[k][j]=a[k][j]/tot;
  b[k][j]=b[k][j]/tot;
  }
  //afficheM(b);
  //afficheM(a);
   
   
 for (i=0;i<nmax;i++)
  {
  if (i!=k)  
   {
   tot=a[i][k];
   
   for (int j=0;j<nmax;j++)
    {
    a[i][j]=a[i][j]-tot*a[k][j];
    b[i][j]=b[i][j]-tot*b[k][j];
    }
   }
  }
 }
 
 //cout<<"b10="<<b[1][0]<<endl;
 
 
 
 
 //on rempli la matrice inverse A
 for(int z=0;z<nmax;z++)
  {
  for (int s=0;s<nmax;s++)
  A[z][s]=b[z][s];
  }  
 
 //afficheM(A);  
 
}  
   

n°1088103
blastman
just me !
Posté le 18-05-2005 à 16:15:38  profilanswer
 

avec une balise code ce serait mieux pour lire


---------------
http://www.blastmanu.info
n°1088110
nicosmos
Posté le 18-05-2005 à 16:18:31  profilanswer
 

qu est ce donc une balise code

n°1088129
Elmoricq
Modérateur
Posté le 18-05-2005 à 16:37:35  profilanswer
 

Balise de code = bouton http://forum-images.hardware.fr/icones/message/c.gif autour de ton code. Ca le présente et le rend lisible. Parce que là j'ai dû faire un copier/coller pour y voir quelque chose.
 
 
Ensuite, il faut savoir que "NaN" (et non "nan" ) signifie : Not a Number.
Alors a priori, y a eu un souci de calcul, genre une division par zéro (quoique ça plante dans ce cas, non ? je sais plus, je fais aucune division sans contrôler depuis longtemps) ou autre joyeuseté du même goût.
 
Difficile à voir, car pas assez de code dans ce que tu nous as mis. Ensuite l'algo en lui-même je ne saurais pas le contrôler, j'ai la flemme d'aller voir à quoi ressemble celui de Gauss-Jordan pour vérifier que tu l'as correctement codé.


Message édité par Elmoricq le 18-05-2005 à 16:38:16
n°1088153
nicosmos
Posté le 18-05-2005 à 16:54:43  profilanswer
 

Elmoricq
desolé je ne connais pas ce bouton.
 
je pense aussi qu il y a une division par zero mais elle est a l interieur des calculs.  
je n ai pas reussi a debogger.
mais le code tourne pour une matrice que l ordi donne par random . et pas pour un fichier lut!!!!
tout le pb est là.
 est ce que tu connais un code d inversion qui tourne avec une mat d'au moins 32*32.

n°1088165
Elmoricq
Modérateur
Posté le 18-05-2005 à 17:05:38  profilanswer
 

nicosmos a écrit :

Elmoricq
desolé je ne connais pas ce bouton.


 
Observe mieux ta fenêtre de réponse à ce forum.
 
 

nicosmos a écrit :

je pense aussi qu il y a une division par zero mais elle est a l interieur des calculs.  
je n ai pas reussi a debogger.


 
Tu utilises quel debugger ?
 

nicosmos a écrit :

mais le code tourne pour une matrice que l ordi donne par random . et pas pour un fichier lut!!!!
tout le pb est là.


 
Fais un test sur ta variable "tot" avant de diviser avec.
Et donne le code que tu utilises pour lire une matrice dans un fichier, avec un exemple de fichier qui va avec.
 
 

nicosmos a écrit :

est ce que tu connais un code d inversion qui tourne avec une mat d'au moins 32*32.


 
Pourquoi faire ?
Puisque ton algorithme fonctionne pour une matrice random mais pas pour un fichier lu, alors c'est pas l'algorithme qui est en cause.

n°1088174
blastman
just me !
Posté le 18-05-2005 à 17:09:01  profilanswer
 


Ce bouton http://forum-images.hardware.fr/icones/message/c.gif ce situe entre celui-ci http://forum-images.hardware.fr/icones/message/fixe.gif et celui-là http://forum-images.hardware.fr/icones/message/url.gif et ces boutons  tu les retrouve lorque tu édite un message.
 
Dans ton cas il te suffit de cliquer sur ce bouton http://forum-images.hardware.fr/themes_static/images_forum/1/edit.gif pour éditer ton message ensuite tu observe bien la page qui va s'afficher et dés que tu a trouvé le bouton http://forum-images.hardware.fr/icones/message/c.gif tu clique dessus ensuite tu place ton code juste après, et tu reclique sur ce bouton http://forum-images.hardware.fr/icones/message/c.gif .
 
voila  ;)


Message édité par blastman le 31-05-2005 à 21:56:42

---------------
http://www.blastmanu.info
mood
Publicité
Posté le 18-05-2005 à 17:09:01  profilanswer
 

n°1088188
nicosmos
Posté le 18-05-2005 à 17:11:44  profilanswer
 

est ce possible que les dimensions des calculs depassent les float et cela me donnerai des NaN??

n°1088198
nicosmos
Posté le 18-05-2005 à 17:15:12  profilanswer
 

[quotemsg=1088165,9,14993]Observe mieux ta fenêtre de réponse à ce forum.
 
 
 
 
Tu utilises quel debugger ?
 
je n'utilise pas de debuggeur!!
 

n°1088201
blastman
just me !
Posté le 18-05-2005 à 17:15:50  profilanswer
 

tu peut peu-être montrer un peu plus de code car apparemment le code que tu as mis est correct


---------------
http://www.blastmanu.info
n°1088202
Tarabiscot​e
Posté le 18-05-2005 à 17:16:48  profilanswer
 

nicosmos a écrit :

est ce possible que les dimensions des calculs depassent les float et cela me donnerai des NaN??


 
Non, normalement ça donne INF dans ce cas là.

n°1088204
Chronoklaz​m
Posté le 18-05-2005 à 17:17:48  profilanswer
 

Depasser 2^150 ou une chose dans ce style ??
 
A mon avis ta une division par zero qui traine qq part ...


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1088205
nicosmos
Posté le 18-05-2005 à 17:18:03  profilanswer
 

voila le code pour remplir la matrice a partir d un fichier
 
[cpp]
void matricesource(float a[nmax][nmax])
{
     
  int ncol;
   
   
  FILE *myFile77;
  myFile77=fopen ("/home/nchiriji/matrice_p_3.txt","r" );
 
for (int i=0;i<nmax;i++)
 {
 ncol = fscanf(myFile77,"%e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e %e\n",
 &a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4],&a[i][5],&a[i][6],&a[i][7],&a[i][8],&a[i][9],
 &a[i][10],&a[i][11],&a[i][12],&a[i][13],&a[i][14],&a[i][15],&a[i][16],&a[i][17],&a[i][18],&a[i][19],
 &a[i][20],&a[i][21],&a[i][22],&a[i][23],&a[i][24],&a[i][25],&a[i][26],&a[i][27],&a[i][28],&a[i][29],
 &a[i][30],&a[i][31]);
 }
 
  fclose (myFile77);
}  
 
 

n°1088207
Chronoklaz​m
Posté le 18-05-2005 à 17:19:44  profilanswer
 

Utilise des balise [ cpp ]  ... ton code ... [ /cpp ]


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1088211
blastman
just me !
Posté le 18-05-2005 à 17:22:03  profilanswer
 

http://forum.hardware.fr/forum2.ph [...] 0#t1088174
 
c'est du C pas du C++
 
il manquerai pas un %e lol


Message édité par blastman le 18-05-2005 à 17:27:34

---------------
http://www.blastmanu.info
n°1088218
Elmoricq
Modérateur
Posté le 18-05-2005 à 17:27:58  profilanswer
 

nicosmos a écrit :

voila le code pour remplir la matrice a partir d un fichier
 
<insérer ici du code horrible>


 
 [:le poney de mr pink]  
 
C'est LAID.
En plus tu pourrais lire n'importe quoi que ce serait pareil, y a rien de testé.
 
La preuve : il n'y a que 31 "%e", ce qui signifie que la dernière colonne de ton fichier est toujours initialisée avec n'importe quoi.


Message édité par Elmoricq le 18-05-2005 à 17:28:37
n°1088646
el muchach​o
Comfortably Numb
Posté le 18-05-2005 à 23:23:35  profilanswer
 

nicosmos, ça te fatigue de mettre les balises qui vont bien autour de ton code ? C'est  la 3 ou 4e fois qu'on te le demande. :heink: Tu crois peut-être que les gens sont à ton service ???


Message édité par el muchacho le 18-05-2005 à 23:23:53
n°1089028
nicosmos
Posté le 19-05-2005 à 13:00:51  profilanswer
 

desolé mis je ne connias pas encore la fenetre de reponses!!

n°1089033
blastman
just me !
Posté le 19-05-2005 à 13:03:50  profilanswer
 

tu te fou de notre gueule ou tu es vraimment con ?  :o  
 
je tes expliquais la démarche pas à pas
 
http://forum.hardware.fr/forum2.ph [...] 0#t1088174
 
Ps :
Il y a quelqu'un qui se désigne pour réaliser un tuto. sur :
1ère partie: "comment éditer un message"  
2èmee partie: "comment insérer une balise code"  
3ème partie: "comment fermer la balise"


Message édité par blastman le 19-05-2005 à 13:11:08

---------------
http://www.blastmanu.info
n°1089302
nicosmos
Posté le 19-05-2005 à 15:40:43  profilanswer
 

premierement je ne me fous pas de ta gueule,
deuxiemement je te réexplique que j ai essayé avec la derniere partie du prog et mettant [cpp].
..
peut etre dois je le mettre d une certaine maniere que je ne connais pas mais que toi OUI!!
merci

n°1089332
Elmoricq
Modérateur
Posté le 19-05-2005 à 15:49:18  profilanswer
 

nicosmos a écrit :

premierement je ne me fous pas de ta gueule,
deuxiemement je te réexplique que j ai essayé avec la derniere partie du prog et mettant [cpp].
..
peut etre dois je le mettre d une certaine maniere que je ne connais pas mais que toi OUI!!
merci


 
Uh.
 
Tu as remarqué qu'en HTML, il fallait encadrer son code par des balises ouvrantes ET fermantes ?
 
Eh bien sur ce forum, c'est pareil, mais avec des balises maison.
Donc il faut encadrer ton code avec une balise ouvrante ( [cpp]), et une autre fermante ( [/cpp ] )
 
Et pour ce qui est de ton problème, change-moi vite cet horrible fscanf en quelque chose de plus propre.


Message édité par Elmoricq le 19-05-2005 à 15:50:04
n°1089367
blastman
just me !
Posté le 19-05-2005 à 15:55:09  profilanswer
 

nicosmos a écrit :

premierement je ne me fous pas de ta gueule,
deuxiemement je te réexplique que j ai essayé avec la derniere partie du prog et mettant [cpp].
..
peut etre dois je le mettre d une certaine maniere que je ne connais pas mais que toi OUI!!
merci


 
Allé, une dernière fois après je peux plus rien faire pour toi [:airforceone]  
 
http://forum.hardware.fr/hardwaref [...] m#t1088174
 
pour ton code à ta place je reverrai tout parce que là c'est pas beau et en plus c'est pas du C++


Message édité par blastman le 19-05-2005 à 15:58:49

---------------
http://www.blastmanu.info
n°1089487
nicosmos
Posté le 19-05-2005 à 16:33:02  profilanswer
 

blastman a écrit :

Allé, une dernière fois après je peux plus rien faire pour toi [:airforceone]  
 
http://forum.hardware.fr/hardwaref [...] m#t1088174
 
pour ton code à ta place je reverrai tout parce que là c'est pas beau et en plus c'est pas du C++


 
 
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  

n°1089497
nicosmos
Posté le 19-05-2005 à 16:34:44  profilanswer
 

je pensais a un "fread"?

n°1089619
skelter
Posté le 19-05-2005 à 17:00:42  profilanswer
 

c++ c'est pas forcement programmation orientee objet, mais toi tu utilises des fonctions C la ou en C++ on utiliserais ifstream

n°1089666
nicosmos
Posté le 19-05-2005 à 17:19:45  profilanswer
 

skelter a écrit :

c++ c'est pas forcement programmation orientee objet, mais toi tu utilises des fonctions C la ou en C++ on utiliserais ifstream


 
je cherche a lire un fichier de valeur num et a les mettre dans un tableau
j utilise fscanf.
que faudrai t il utiliser??

n°1089691
skelter
Posté le 19-05-2005 à 17:39:34  profilanswer
 

tu connais quel langage ? a vu de nez tu ne connais pas le c++ et ca ne s'apprend pas en 5 minutes.

n°1089696
blastman
just me !
Posté le 19-05-2005 à 17:43:38  profilanswer
 

en C++, copie d'un fichier dans un buffer:
 

Code :
  1. #include <fstream>
  2. #include <iostream>
  3. #include <sstream>
  4. int main()
  5. {
  6.    // le constructeur de ifstream permet d'ouvrir un fichier en lecture
  7.     std::ifstream fichier( "fichier.txt" );
  8.     if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
  9.     {
  10.         std::stringstream buffer; // variable contenant l'intégralité du fichier
  11.        // copier l'intégralité du fichier dans le buffer
  12.         buffer << fichier.rdbuf();
  13.        // nous n'avons plus besoin du fichier !
  14.         fichier.close();
  15.        // manipulations du buffer...
  16.         std::cout << "Taille du buffer : " << buffer.str().size() << '\n';
  17.     }
  18. }


 
http://c.developpez.com/faq/cpp/?page=fichiers
 
ps:
ta vu ce que ca donne avec la balise code, tu trouve pas que c'est mieux a la lecture  ;)


Message édité par blastman le 19-05-2005 à 17:47:20

---------------
http://www.blastmanu.info
n°1090821
nicosmos
Posté le 20-05-2005 à 15:21:30  profilanswer
 

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


 
voila l'inversion que j ai traduit d'un prog en pascal?
ce prog ne fonctionne pas lorsque les nombres sont trop grand ou sont trop petits !!
si je passe en double, c'est la lecture de mon fichier qui passe pas!!
je ne sais que faire.
le prog que tu m'as mis m'est totalement incomprehensible a mon niveau. mais je vais plancher!

n°1090870
blastman
just me !
Posté le 20-05-2005 à 15:44:16  profilanswer
 

c'est déja plus beau !
 
c'est a dire ca passe pas ?


---------------
http://www.blastmanu.info
n°1090883
nicosmos
Posté le 20-05-2005 à 15:50:18  profilanswer
 

blastman a écrit :

c'est déja plus beau !
 
c'est a dire ca passe pas ?


 
ca veut dire que lors de l'affichge de la matrice prise dans le fichier source, il m'affiche que des valeurs avec des exponentielles e-315!!  

n°1090887
Elmoricq
Modérateur
Posté le 20-05-2005 à 15:53:35  profilanswer
 

C'est pas "exponentiel", c'est pour dire "10^..."
 
En gros, c'est 0 (affiche avec une précision moins grande).

n°1090911
nicosmos
Posté le 20-05-2005 à 16:03:13  profilanswer
 

Elmoricq a écrit :

C'est pas "exponentiel", c'est pour dire "10^..."
 
En gros, c'est 0 (affiche avec une précision moins grande).


 
 
oui tout a fait c est des puissances de dix..
mais bref ca me donne des valeurs eronées.
est ce possible que le fscanf ne gere que des float??

n°1090946
skelter
Posté le 20-05-2005 à 16:21:34  profilanswer
 

ton fscanf est suicidaire et c'est du c, ici c'est la cat c++

n°1090956
Elmoricq
Modérateur
Posté le 20-05-2005 à 16:26:04  profilanswer
 

skelter a écrit :

ton fscanf est suicidaire


 
C'est ce que j'ai dit par deux fois déjà.  
J'ai abandonné.

n°1090960
skelter
Posté le 20-05-2005 à 16:33:26  profilanswer
 

exact il manque un %e, et je sais pas pourquoi mais je parie que fscanf retourne 0 :pt1cable:

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

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   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  inversion matricielle

 

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-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR