inversion matricielle

inversion matricielle - C++ - Programmation

Marsh Posté le 18-05-2005 à 15:46:28    

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

Reply

Marsh Posté le 18-05-2005 à 15:46:28   

Reply

Marsh Posté le 18-05-2005 à 15:52:05    

quel est le problème :??:


Message édité par tomtom41 le 18-05-2005 à 15:52:19
Reply

Marsh Posté le 18-05-2005 à 15:55:17    

nicosmos a écrit :

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


 
Mais encore ? :heink:

Reply

Marsh Posté le 18-05-2005 à 16:12:24    

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);  
 
}  
   

Reply

Marsh Posté le 18-05-2005 à 16:15:38    

avec une balise code ce serait mieux pour lire


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 18-05-2005 à 16:18:31    

qu est ce donc une balise code

Reply

Marsh Posté le 18-05-2005 à 16:37:35    

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
Reply

Marsh Posté le 18-05-2005 à 16:54:43    

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.

Reply

Marsh Posté le 18-05-2005 à 17:05:38    

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.

Reply

Marsh Posté le 18-05-2005 à 17:09:01    


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
Reply

Marsh Posté le 18-05-2005 à 17:09:01   

Reply

Marsh Posté le 18-05-2005 à 17:11:44    

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

Reply

Marsh Posté le 18-05-2005 à 17:15:12    

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

Reply

Marsh Posté le 18-05-2005 à 17:15:50    

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


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 18-05-2005 à 17:16:48    

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à.

Reply

Marsh Posté le 18-05-2005 à 17:17:48    

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 !
Reply

Marsh Posté le 18-05-2005 à 17:18:03    

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);
}  
 
 

Reply

Marsh Posté le 18-05-2005 à 17:19:44    

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


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 18-05-2005 à 17:22:03    

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
Reply

Marsh Posté le 18-05-2005 à 17:27:58    

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
Reply

Marsh Posté le 18-05-2005 à 23:23:35    

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
Reply

Marsh Posté le 19-05-2005 à 13:00:51    

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

Reply

Marsh Posté le 19-05-2005 à 13:03:50    

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
Reply

Marsh Posté le 19-05-2005 à 15:40:43    

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

Reply

Marsh Posté le 19-05-2005 à 15:49:18    

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
Reply

Marsh Posté le 19-05-2005 à 15:55:09    

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
Reply

Marsh Posté le 19-05-2005 à 16:33:02    

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  

Reply

Marsh Posté le 19-05-2005 à 16:34:44    

je pensais a un "fread"?

Reply

Marsh Posté le 19-05-2005 à 17:00:42    

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

Reply

Marsh Posté le 19-05-2005 à 17:19:45    

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??

Reply

Marsh Posté le 19-05-2005 à 17:39:34    

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

Reply

Marsh Posté le 19-05-2005 à 17:43:38    

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
Reply

Marsh Posté le 20-05-2005 à 15:21:30    

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!

Reply

Marsh Posté le 20-05-2005 à 15:44:16    

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


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 20-05-2005 à 15:50:18    

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!!  

Reply

Marsh Posté le 20-05-2005 à 15:53:35    

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

Reply

Marsh Posté le 20-05-2005 à 16:03:13    

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??

Reply

Marsh Posté le 20-05-2005 à 16:21:34    

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

Reply

Marsh Posté le 20-05-2005 à 16:26:04    

skelter a écrit :

ton fscanf est suicidaire


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

Reply

Marsh Posté le 20-05-2005 à 16:33:26    

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

Reply

Marsh Posté le 20-05-2005 à 16:57:10    

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à.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed