[Matlab] Lecture fichier sans erreur

Résolu/Fermé
aurna Messages postés 184 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 26 novembre 2009 - 28 oct. 2008 à 18:44
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 - 4 nov. 2008 à 00:21
Bonjour,
J'ai un projet à remettre à mon prof.
Je travaille sous matlab et j'ai 400 images à traiter. J'ai crée pour chacune des images un fichier contenant toutes les informations relatives qui me serviront,à savoir,la variance,moyenne et déterminant de certaines matrices.
Maintenant je dois lire ces fichiers pour faire mes caculs. Le problème est que j'utilise la sscanf qui me change les valeurs qu'elle lit,notament,elle les arrondit,ou les taille et ça me donne des résultats faux.Je voudrais prendre les valeurs telles quelle. Voici un exemple de fichier.

Moyenne 55.497561 47.445976
Déterminent 247658.513451
Inverse 0.001672 -0.000006 -0.000006 0.002416


Supposons que je doive considerer la dernière ligne qui initialement était une matrice 2x2,mais que quand je l'écrit dans le fichier en utiisant la fonction fprintf(g,'%f ',inversa); où inversa est une matrice 2x2
,ça me donne une seule ligne et quand je lis cette ligne ainsi

fid = fopen(filename, 'r');
while feof(fid) == 0
tline = fgetl(fid);
res=tline(1,b+1:end );
M1=sscanf(res,'%f');


b=size('Inverse') dans le cas de la dernière ligne.Je l'ai pas écrit parcek c'est un long programme et ça serait peut etre inutile. donc dans tline je prends toute la ligne. dans res je mets seulement les chiffres que lis avec sscanf et ça me donne un vecteur colonne.

M1 =

0.0017
-0.0000
-0.0000
0.0024


mais quand je vais faire les calculs,vu qu'il s'agit de calculs entre matrices,je rencontre des problèmes au niveau de la dimension de matrice qui a été altérée lors de l'écriture dans le file. Je résouds ce problème ainsi:
s=reshape(M1,2,2) et je récupère ainsi ma matrice avant de l'avoir écrite dans le file. Si quelqu'un a une meilleure idée je l'accepte volontiers.

Cependant mon problème principale est celui dont j'ai parlé précédement.Vous pouvez noter que les chiffres de M1 ne sont pas égaux à ceux qui sont dans le fichier(ligne qui commence par "inverse") en effet 0.001672 devient 0.0017, -0.000006 devient 0 etc...
Je vous prie de me dire quelle autre fonction je peux utiliser pour retrouver ma matrice avec ses valeurs intactes.
Merci de me répondre.
A voir également:

9 réponses

Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
29 oct. 2008 à 18:24
Salut
Tes nombres ont bien les bonnes valeurs sous MatLab. C'est juste l'affichage qui te donne cet arrondi. Dans les calculs, MatLab utilise les vraies valeurs que t'as données, il y a aucun souci.
Fais par exemple
x=0.001672
Ça te donne
x =

    0.0017
Change alors l'affichage
format long
x
T'obtiens
x =

   0.001672000000000
À plus
0
aurna Messages postés 184 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 26 novembre 2009 7
29 oct. 2008 à 19:37
Salut,merci de m'avoir répondu,mais je pense pas que ce soit vrai,car lorsque je fais les calculs,ils sont faut à un millième près.Par exemple,où je dois obtenir 1,j'obtiens 1,0001 par exemple ou alors 0.9991.ce sont juste des exemples.Je me dis que je dois ajouter quelque chose au format de la sscanf du genre %5f mais ça ne fonctionne pas.
Je reste à l'écoute,le problème persiste.Je vous remercie.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
29 oct. 2008 à 19:40
Si c'est vrai
À plus
0
aurna Messages postés 184 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 26 novembre 2009 7
29 oct. 2008 à 20:04
pourquoi mes calculs seraient ils faux alors? j'ai essayé plusieurs fois !!!
Merci
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
29 oct. 2008 à 20:08
Un problème d'erreurs numériques je suppose...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aurna Messages postés 184 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 26 novembre 2009 7
3 nov. 2008 à 19:19
jusqu'à présent je ne vois pas de problème en dehors de cette sscanf.
Quelqu'un peut-il m'aider SVP?
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
3 nov. 2008 à 19:22
Je le dis et je le répète, tout calcul numérique a ses erreurs numériques.
Un exemple simple, tape ceci sous MatLab :
0.3-0.2-0.1
T'obtiens 0 ?
Non, t'obtiens ceci :
>>0.3-0.2-0.1

ans =

  -2.7756e-17
Voilà ce que j'obtiens quand je tape tes quelques lignes :
>>b=size('Inverse',2);
fid = fopen('data.txt', 'r');
while feof(fid) == 0
tline = fgetl(fid);
res=tline(1,b+1:end );
M1=sscanf(res,'%f'); 
end
>>M1

M1 =

    0.0017
   -0.0000
   -0.0000
    0.0024
>>format long
>> M1

M1 =

   0.001672000000000
  -0.000006000000000
  -0.000006000000000
   0.002416000000000
Les valeurs de M1 que MatLab a en mémoire sont les bonnes valeurs, c'est juste l'affichage qui donne un arrondi. Si on remets l'affichage en short (mais sans les tongs), voilà ce qu'on a :
>> format short
>> M1

M1 =

    0.0017
   -0.0000
   -0.0000
    0.0024
0
aurna Messages postés 184 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 26 novembre 2009 7
3 nov. 2008 à 21:06
ok merci et que doisje donc faire pour avoir mes valeurs correctes? vu qu'en fait je calcule une matrice 400x400 et sur la diagonale je dois avoir des 1,mais j'ai des 1.00001,1,00004 ,0.99999 etc... Pourtant avant que je n'utilise sscanf je faisais les MEMES calculs et j'avais exactement 1 sur la diagonale de ma matrice.J'ai changé de façon de procéder parceque matlab mettait trop de temps,j'ai donc voulu optimiser le code et je me trouve obligé de prendre des floats dans un vecteur de charactères séparés pas des espaces. STP dis moi alors comment je peux faire pour mettre mes valeurs au bon point. Pour une valeur ou 2 il suffit peut etre de format long comme tu l'as dit. Mais pour une matrice?
Merci encore
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
3 nov. 2008 à 21:32
Si ça donnait les bons résultats avant, c'est au niveau de l'écriture et non de la lecture qu'il y a un souci.
Utilise plutôt '%e' ou même '%s' quand tu copies ta matrice dans le fichier (si tu la copies en en tant que chaîne de caractères, convertis-la avant).
Tu peux aussi choisir '%g', ça prendra la notation la plus compacte entre '%f' et '%e' et en plus ça écrit pas les zéros inutiles.
0
aurna Messages postés 184 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 26 novembre 2009 7
4 nov. 2008 à 00:11
je te fais savoir. Merci
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 834
4 nov. 2008 à 00:21
OK !
De rien ;-)
0