Deschidem netcdf în MATLAB (de exemplu reanaliza ncep), notele oceanografului - procesare și

Sarcina: Deschideți fișierul netCDF în MATLAB
Soluția. curățați MATLAB necomplicat

Voi încerca să descriu aici răspunsul la această întrebare arzătoare, pentru a trimite oamenii care suferă din diverse foruri. Începând cu versiunea 7.7, Matlab acceptă nativ de lucru cu formatul netCDF nativ, fără diferite gadget-uri care au fost solicitate mai devreme. Sintaxa care este folosită pentru a lucra cu fișierele netCDF este destul de ciudată, bine, nu este pentru mine să judec. Aici voi descrie modul de realizare a unei acțiuni simple în Matlab, și anume, pentru a citi datele dintr-un fișier.







Dacă intenționați să lucrați cu netCDF. atunci pentru început ar fi frumos să te familiarizezi cu ceea ce reprezintă acest format. În acest caz, în continuare nu vă va părea un nebun. Dar, în general, poți să faci fără aceste cunoștințe unice, dacă tot ce ai nevoie este să scapi datele din fișier și să uiți netCDF ca un vis teribil. . Informatii despre functiile Matlab pentru lucrul cu netCDF se gasesc aici.

Ca rezultat, obțineți o etichetă cu datele din fișierul dvs. În general, ar trebui să vă interesați doar ce este în secțiunea Variabile. care este, informații despre variabilele conținute în fișierul dvs. În acest exemplu, aceste variabile sunt lat (latitudine), lon (longitudine), timp (timpul scurs de la 1-1-1 00: 00: 0.0 în ore), aer (temperatura aerului în Kelvin).

UPD. Se spune că nu toate versiunile Matlab au o funcție ncdisp. Dacă aveți același caz neglijat, atunci pentru Windows descărcați binarele ncdump de aici. pentru Ubuntu Linux și alții ca el scrie în terminal:

sudo apt-get instala netcdf-bin

Apoi, în fereastra terminalului sau Linux introduceți comanda

în teorie, dacă lucrați în Windows, atunci programul ncdump.exe ar trebui să fie în dosarul cu fișierul. Această comandă va afișa aproximativ aceleași informații ca ncdisp.

În primul rând să încercăm să obținem lucrul principal - temperatura aerului. Mai întâi de toate, trebuie să deschideți fișierul pentru ca Matlab să lucreze cu acesta:

Din anumite motive interne, funcțiile care solicită date din variabilele netCDF. lucrează nu cu numele lor, ci cu numerele lor ordinale, așa că trebuie să știm ce număr ordinal al aerului variabil este:

>> varid = netcdf. inqVarID # 40; ncid, "aer" # 41;

Avem numărul de serie 3. În general, am putea conta pe noi înșine, știind că numărul variabilelor în acest caz vine de la zero și nu de la unitate.
Acum, cunoscând numărul ordinal al variabilei netCDF, putem copia valorile din ea în variabila Matlab:

date = netcdf. getVar # 40; ncid, 3 # 41; ;

Ca rezultat, obțineți o matrice tridimensională [longitudine, latitudine, timp]. Se pare că problema a fost rezolvată, dar nu vă grăbiți. Dacă priviți valorile din datele variabile. ele se vor asemăna foarte mult de ceea ce vă așteptați să vedeți, astfel de temperaturi, chiar dacă sunt exprimate în Kelvin, nu există pe Pământ. Faptul este că datele din fișierele de reanaliză sunt stocate ca întregi, care ocupă mult mai puțin spațiu decât numerele în virgulă mobilă. Acest lucru se face pentru a face fișierele mai mici. Pentru a obține temperatura, trebuie să convertiți aceste date într-un mod simplu.







Dacă priviți atributele pentru aerul variabil. primit folosind ncdisp. atunci veți vedea acolo:

add_offset = 513
scale_factor = 0,01

Pentru a obține date în Kelvin, trebuie să multiplicați totul cu ajutorul scale_factor și să adăugați add_offset.

Puteți lua pur și simplu aceste numere din descrierea fișierului sau le puteți scoate folosind următoarele comenzi:

add_off = netcdf. getAtt # 40; ncid, 3. 'add_offset' # 41;
scale_factor = netcdf. getAtt # 40; ncid, 3. "scale_factor" # 41;

Din păcate, doar înmulțirea și adăugarea nu vor funcționa. Dacă încercați acum să faceți această operație, veți obține următoarea eroare:

Integerii pot fi combinați numai cu numere întregi din aceeași clasă. sau dublurile scalare.

Faptul este că tipul de date variabile este acum int16 și nu doresc să se înmulțească prin numere în virgulă mobilă. Este necesar să se traducă datele în singur

data_single = singură # 40; date # 41; ;

De fapt, puteți face acest lucru deja când copiați date din variabila netCDF la variabila Matlab. Apoi traducem în Kelvin:

data_scaled = # 40; date_single * scale_factor # 41; + add_off;

.. dacă este necesar, în Celsius

data_cel = data_scaled- 273.15

Da, deloc. Arată destul de standard, deci ar trebui să fie la fel. Numai în mod inteligibil nu este necesar să se adauge și să se multiplice, iar valorile sunt date imediat în kelvine.
Și de ce au decis să deschidă matlabul? Poate sub limba pe care o folosiți acolo este o interfață netCDF?

Bună ziua. Aș vrea să vă întreb - cum puteți găsi temperatura și poate exista vânt de-a lungul zonei Mării Azov?
Am descarcat fisierul de testare netCDF, dar ar fi foarte interesant sa obtineti date despre zona Mării Azov!

Cum se obține aceste date cu privire la temperatura straturilor este încă interpolare, acestea sunt datele calculate. Măsoară temperatura exact prin straturi?

.? Încă o întrebare - ați trecut pe Python c Matlab din ce motiv?
Din cauza Python-ului gratuit?
Mi se pare că Matlab este un instrument foarte puternic, este destul de greu să merg în altă parte ...

Fișierul este global, prin urmare, bineînțeles, și Marea Azov este acolo. Cu toate acestea, rezoluția datelor va fi foarte dură. Pe site-ul NCEP există vânt și alte caracteristici ale atmosferei, dar dacă aveți nevoie de mai multă permisiune, este mai bine să căutați anumite produse regionale.

Aceste date sunt obținute prin asimilarea datelor observațiilor de câmp în modelul de circulație atmosferică. De fapt, putem spune că aceasta este o circulație dinamică.

Pe scurt, Matlab este un instrument puternic, dar nu flexibil, nu poate ține pasul cu lumea în schimbare.

Nume dimensiune Bytes Attributes class

date 1 × 1 4 int32

care este netcdf.getVar dă un număr - int32. ca numărul său 32767 nu se deplasează ...

A devenit interesant - de ce în dosar 75 KB un singur număr?

32767 este o valoare lipsă, ar trebui să fie în aceste fișiere. Trebuie să le schimbi la NaN.

Nu uitați de decalajul și scara (în măsura în care văd, pentru a obține valorile corecte, trebuie doar să vă multiplicați cu 100)

Vă mulțumesc foarte mult! Totul sa dovedit. M-am gândit că a fost o greșeală, erau prea multe înțelesuri lipsă.

Zdrabstbyite!
Ajutăți-mă să vă protejeze, să vă ajute să eliminați atmosfera din NCEP, să vă reanalizați cota de încărcare până la sfârșitul perioadei,

Postarea comentariului dvs.







Trimiteți-le prietenilor: