Effacer les filtres
Effacer les filtres

dimensions of opened NetCDF files

5 vues (au cours des 30 derniers jours)
Christoph
Christoph le 22 Oct 2012
Hi,
I frequently use NetCDF files to load data in Matlab:
ncload mydata.nc; for a quick open of new files
nc_varget(); to get specific variables
Now, I changed to a new workplace and found here the handling with
ncid = netcdf.open('myfile.nc','nowrite');
varid = netcdf.reqvarid(ncid,'variable');
data = netcdf.getVar(ncid,varid);
This works, but the dimension is changed: While ncload loads the variable correctly as e.g. 12 x 40 x 180 x 90 (as described in the NetCDF file, ncdump),
with netcdf.getVar I get a variable of size 90 x 180 x 40 x12, which is quite inconvenient. Is this a usual behavior of netcdf.xxx or is there something I didn't recognize?
I appreciate any information, Christoph

Réponse acceptée

John
John le 23 Oct 2012
When you shell out to run ncdump, you are running a C executable that is linked into the netcdf library. Since it is written in C, it used row-major order, so "time_counter" becomes the first dimension listed as it varies the slowest.
MATLAB is column-major order, so "time_counter" gets listed last, since that's where the slowest-varying dimension would be.
So, no, no mistake, it's just fallout from row-major-order vs. column-major-ordering. Also, since you are using NC_VARGET, check the snctools README, there's a discussion of the issue there.
  1 commentaire
Christoph
Christoph le 24 Oct 2012
John, Thank you very much

Connectez-vous pour commenter.

Plus de réponses (2)

John
John le 22 Oct 2012
Hi Christoph,
The "ncload" function referred to is part of the "netcdf toolbox", which is a very old and unsupported piece of software. It transposes the data when it reads and writes, whereas the native netcdf.getVar and putVar functions do not transpose, thus preserving the ordering of the data.
  1 commentaire
Christoph
Christoph le 23 Oct 2012
Modifié(e) : Christoph le 23 Oct 2012
Hi John, thanks for your reply. Since ncload is that old I would assume there's trouble with that, but the opposite is the case:
!ncdump -h run10/BTST25_1m_19900101_19901231_grid_T.nc
netcdf BTST25_1m_19900101_19901231_grid_T {
dimensions:
x = 454 ;
y = 512 ;
deptht = 64 ;
time_counter = UNLIMITED ; // (12 currently)
tbnds = 2 ;
variables:
[...]
float votemper(time_counter, deptht, y, x) ;
votemper:units = "degC" ;
votemper:standard_name = "temperature" ;
votemper:_FillValue = 9.96921e+36f ;
votemper:coordinates = "time_counter deptht nav_lat nav_lon" ;
Then, if I use
ncload run10/BTST25_1m_19900101_19901231_grid_T.nc;
size(votemper)
ans =
12 64 512 454
Same for nc_varget:
clear
ncfile = 'run10/BTST25_1m_19900101_19901231_grid_T.nc';
data = nc_varget(ncfile,'votemper');
size(data)
ans =
12 64 512 454
However, with netcdf.xxx I get the following:
clear
ncid=netcdf.open('run10/BTST25_1m_19900101_19901231_grid_T.nc','nowrite');
varid=netcdf.inqVarID(ncid,'votemper');
data = netcdf.GetVar(ncid,varid);
size(data)
ans =
454 512 64 12
I don't know, whether this is due to a mistake of how I handle the ncfile, or some bug in the NetCDF package used here? Kindly appreciate further ideas or comments... thanks.
Christoph

Connectez-vous pour commenter.


Odontungalag Dorjsuren
Odontungalag Dorjsuren le 28 Avr 2015
HI. How to open data .nc

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by