inversion matricielle - C++ - Programmation
Marsh Posté le 18-05-2005 à 15:52:05
quel est le problème
Marsh Posté le 18-05-2005 à 15:55:17
ReplyMarsh 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);
}
Marsh Posté le 18-05-2005 à 16:15:38
ReplyMarsh Posté le 18-05-2005 à 16:37:35
Balise de code = bouton 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é.
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.
Marsh Posté le 18-05-2005 à 17:05:38
nicosmos a écrit : Elmoricq |
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. |
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!!!! |
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.
Marsh Posté le 18-05-2005 à 17:09:01
Ce bouton ce situe entre celui-ci et celui-là et ces boutons tu les retrouve lorque tu édite un message.
Dans ton cas il te suffit de cliquer sur ce bouton pour éditer ton message ensuite tu observe bien la page qui va s'afficher et dés que tu a trouvé le bouton tu clique dessus ensuite tu place ton code juste après, et tu reclique sur ce bouton .
voila
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??
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!!
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
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à.
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 ...
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);
}
Marsh Posté le 18-05-2005 à 17:19:44
Utilise des balise [ cpp ] ... ton code ... [ /cpp ]
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
Marsh Posté le 18-05-2005 à 17:27:58
nicosmos a écrit : voila le code pour remplir la matrice a partir d un fichier |
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.
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. Tu crois peut-être que les gens sont à ton service ???
Marsh Posté le 19-05-2005 à 13:00:51
desolé mis je ne connias pas encore la fenetre de reponses!!
Marsh Posté le 19-05-2005 à 13:03:50
tu te fou de notre gueule ou tu es vraimment con ?
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"
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
Marsh Posté le 19-05-2005 à 15:49:18
nicosmos a écrit : premierement je ne me fous pas de ta gueule, |
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.
Marsh Posté le 19-05-2005 à 15:55:09
nicosmos a écrit : premierement je ne me fous pas de ta gueule, |
Allé, une dernière fois après je peux plus rien faire pour toi
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++
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 |
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
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
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??
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.
Marsh Posté le 19-05-2005 à 17:43:38
en C++, copie d'un fichier dans un buffer:
Code :
|
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
Marsh Posté le 20-05-2005 à 15:21:30
Code :
|
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!
Marsh Posté le 20-05-2005 à 15:44:16
ReplyMarsh Posté le 20-05-2005 à 15:50:18
blastman a écrit : c'est déja plus beau ! |
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!!
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).
Marsh Posté le 20-05-2005 à 16:03:13
Elmoricq a écrit : C'est pas "exponentiel", c'est pour dire "10^..." |
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??
Marsh Posté le 20-05-2005 à 16:21:34
ton fscanf est suicidaire et c'est du c, ici c'est la cat c++
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é.
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
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à.
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