Lire suite de Chiffre (ds fichier txt) matlab

Résolu/Fermé
S.Taupin Messages postés 1 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 17 novembre 2008 - 17 nov. 2008 à 15:03
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 - 25 nov. 2008 à 13:02
Bonjour,
Dans le cadre d'un TIPE nous devons faire un programme sur matlab pour exploiter des données de températures océaniques issues d'une base .
Nous avons des fichiers de ce type , :

ftp://ftp.nodc.noaa.gov/pub/data.nodc/woa/DATA_ANALYSIS/DATA/climatology/t00an1.gz

Donc c'est une suite de chiffre sur 10 colonnes et beaucoup de lignes , et apparament les chiffres se lisent "les uns à la suite des autres".
En gros on aurait besoin de créer une matrice en 3 dimensions pour stocker nos valeurs de température , pour notre lecture on aurait 3 boucles , une sur la latitude , l'autre sur la longitude et la dernière sur la profondeur.

C'est pas évident d'expliquer la façon dont les données sont données sont rangées par écrit donc je vais donner un exemple de ce qu'il nous faudrait faire:

Le premier chiffre du fichier correspond au point de coordonnée (89.5° de latitude Nord , 0° de longitude , profondeur 0) , les 27 données suivantes correspondent aux données de température sur 27 niveaux ( donc 28 en tout) , donc il faut que l'algo stocke toutes ces données dans une même "colonne d'eau" dans ma matrice 3D (j'espère que c'est assez clair , pas évident :D.)
Ensuite l'algo doit faire la même chose pour le point de coordonnée (89.5°,0.5°) sur les 28 profondeurs , puis (0.5°,1°) etc.
Ensuite une fois que le "tour" de la terre est fait il faut passer la latitude 89,0 et refaire la même opération...

Il faut faire ça sur tout le globe , est-ce que vous savez comment effectuer ce genre de requêtes sur matlab? Je suis assez novice en programmation matlab et je n'ai jamais fait ce genre de choses.

Merci beaucoup , j'espère avoir été compréhensible :).

PS: ne vous étonnez pas de ne voir que des 99,9999 dans les premières pages de ce fichier , il n'y a évidemment pas de données au niveau des pôles , des continents ou partout sur les océans... ce sont des données issues des campagnes océanographiques.
A voir également:

2 réponses

Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 375
19 nov. 2008 à 12:50
Bonjour
Ton fichier contient 213840 lignes.
À raison de 10 valeurs par lignes, cela donne un total de 2138400 valeurs.
2138400 n'est pas un multiple de 28.
Donc soit je n'ai pas compris ta demande, soit il y a une erreur dans la façon dont tu veux exploiter ton fichier de données.
Bon après-midi
0
Désolé , je n'avais pas vu votre réponse.
Effectivement il y avait deux erreurs : les profondeurs sont sur 16 niveaux .
Je n'avais pas bien compris la façon dont été organisées les données:

Je reprend mon exemple précédent en le modifiant:

Le premier chiffre du fichier correspond au point de coordonnée (89.5° de latitude Nord , 0° de longitude , profondeur 1) , les 359 données suivantes correspondent aux données de température en faisant un "tour du globe"
Ensuite on recommence pour (88,5°,0°,profondeur 1 )
Donc il suffit d'une matrice de taille 360x180 ( à peu près ) pour stocker les températures à la prondeur k.

Une fois que la totalité du globe a été parcourue on passe à la profondeur 2 , on refait tout le globe , on passe à la profondeur suivante ... etc


D'après ce que j'ai compris sur mes recherches il faut utiliser la fonction fopen pour ouvrir le fichier mais en faisant des test sur un fichier " au pif"

f=fopen('nom_fichier.txt','r')

J'obtiens ans=3 donc je comprend pas bien . J'ai cherché dans l'aide mais je n'ai rien trouvé sur ce problème.

Ensuite pour lire le fichier il faut utiliser fscan apparemment , pareil j'ai un peu de mal à comprendre le fonctionnement de cette fonction .

Voila le prototype de programme: (

f = fopen ('nom_du_fichier', '')
Temp = zeros (360, 180, 28);
for m = 1:28
Temp (:, :, m) = fscanf (f, '%f%f%f%f%f%f%f%f%f%f\n', [360, 180]);
end


Ca vous semble correct comme programme? En particulier je comprend pas à quoi correspond le n à la fin..

Merci beaucoup.
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 375
25 nov. 2008 à 13:02
Bonjour

Ça ne correspond toujours pas au nombre de valeurs dans le fichier.
À raison d'un pas d'1/2 degré pour la longitude, cela donne 2*360 = 720 positions.
À raison d'un pas d'1/2 degré pour la latitude en excluant les pôles, cela donne 2*180-1 = 359 positions.
À raison de 16 positions pour la profondeur, cela donne un total de 359*720*16 = 4135680 valeurs dans le fichier, ce qui n'est pas le cas.

Ton petit programme est de toute façon faux puisque le pas est d'1/2 degré et que comme tu me l'as dit, il y a 16 position pour la profondeur.

Le 3 que tu obtiens n'a aucune importance, il s'agit juste d'un identifiant pour le fichier que tu ouvres, les identifiants 1 et 2 étant déjà pris respectivement pour le standard output et le standard error. Le seul cas où il y a à s'inquiéter de la valeur que cela sort, c'est quand il s'agit de -1, cela veut dire qu'il y a une erreur.

Le \n, tu n'as pas besoin de l'utiliser à la lecture. C'est pour passer à une nouvelle ligne.

Pour lire le fichier tel qu'il est, il suffit de faire :
fid=fopen('t00an1','r');
M=fscanf(fid, '%f', [10 213840]);
M=M.';
fclose(fid);
Il suffit ensuite d'utiliser un reshape pour donner à M la taille qui convient. Mais dans la mesure où tu ne sais pas comment sont organisées les données, il est malheureusement impossible d'aller plus loin.

Bon après-midi
0