Lire suite de Chiffre (ds fichier txt) matlab [Résolu/Fermé]

Signaler
Messages postés
1
Date d'inscription
lundi 17 novembre 2008
Statut
Membre
Dernière intervention
17 novembre 2008
-
Fee Fay
Messages postés
639
Date d'inscription
vendredi 17 octobre 2008
Statut
Membre
Dernière intervention
31 mai 2009
-
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.

2 réponses

Messages postés
639
Date d'inscription
vendredi 17 octobre 2008
Statut
Membre
Dernière intervention
31 mai 2009
378
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
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.
Messages postés
639
Date d'inscription
vendredi 17 octobre 2008
Statut
Membre
Dernière intervention
31 mai 2009
378
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