
Problemas con ncwrite
Publicado por Atenas (4 intervenciones) el 22/02/2018 02:28:46
Hola a toda la comunidad de programadores y usuarios de matlab:
Estoy trabajando con archivos NetCDF en Matlab2014.
Quiero crear una nueva variable (una matriz de datos) en un archivo netCDF existente. El problema está que no puede ejecutar ncwrite. En el matlab help me da las siguientes instrucciones:
ncwrite(filename,varname,vardata)
(los ejemplos en el matlab help son solo para un valor, y no para una matriz como es mi caso):
nccreate('myfile.nc','pi');
ncwrite('myfile.nc','pi',3.1);
ncwriteatt('myfile.nc','/','creation_time',datestr(now));
% overwrite existing data
ncwrite('myfile.nc','pi',3.1416);
ncdisp('myfile.nc');
y si lo escribo de la siguiente manera:
ncwrite('etopo1-scar.nc','h',j);
Siendo etopo1-scar.nc mi filename, h, mi varname y j mi var data, obtengo:
Error using netcdflib
The NetCDF library encountered an error during execution of 'putVaraDouble' function - 'Start+count exceeds dimension bound (NC_EEDGE)'.
Error in netcdf.putVar (line 84)
netcdflib(funcstr,ncid,varid,varargin{:});
Error in internal.matlab.imagesci.nc/write (line 831)
netcdf.putVar(gid, varid,start, count, varData);
Error in ncwrite (line 75)
ncObj.write(varName, varData, start, stride);
He probado de distintas maneras y lo mas que me he acercado a lo que quiero obtener es si coloco:
ncwrite('etopo1-scar.nc','h',j(1:10801);
Nota: Mi matriz j que contiene los datos de mi variable mide 10801x21601
Con lo anterior obtengo la nueva variable h pero con los valores de j solo en la primera columna, Algo as:
60 9.96e+36 9.96e+36 9.96e+36 ...
54 9.96e+36 9.96e+36 9.96e+36 ...
53 9.96e+36 9.96e+36 9.96e+36 ...
13 9.96e+36 9.96e+36 9.96e+36 ...
70 9.96e+36 9.96e+36 9.96e+36 ...
23 9.96e+36 9.96e+36 9.96e+36 ...
34 9.96e+36 9.96e+36 9.96e+36 ...
. . . .
. . . .
. . . .
(adjunto mi pequeño código de principiante):
Funciona solo con un dato, por ejemplo si mi VarData es 34, lo escribe en mi matriz j en el punto (m=1, n=1)
Y funciona con un vector (como está en mi script).
Cómo puedo establecer que mi VarData es una matriz y no un solo dato, o un vector?
Y que escriba toda la matriz j en mi variable llamada h (la cual mide lo mismo que j 10801x21601 )
Gracias de antemano y espero haberme explicado...
Saludos cordiales
Mar.Mo.
Estoy trabajando con archivos NetCDF en Matlab2014.
Quiero crear una nueva variable (una matriz de datos) en un archivo netCDF existente. El problema está que no puede ejecutar ncwrite. En el matlab help me da las siguientes instrucciones:
ncwrite(filename,varname,vardata)
(los ejemplos en el matlab help son solo para un valor, y no para una matriz como es mi caso):
nccreate('myfile.nc','pi');
ncwrite('myfile.nc','pi',3.1);
ncwriteatt('myfile.nc','/','creation_time',datestr(now));
% overwrite existing data
ncwrite('myfile.nc','pi',3.1416);
ncdisp('myfile.nc');
y si lo escribo de la siguiente manera:
ncwrite('etopo1-scar.nc','h',j);
Siendo etopo1-scar.nc mi filename, h, mi varname y j mi var data, obtengo:
Error using netcdflib
The NetCDF library encountered an error during execution of 'putVaraDouble' function - 'Start+count exceeds dimension bound (NC_EEDGE)'.
Error in netcdf.putVar (line 84)
netcdflib(funcstr,ncid,varid,varargin{:});
Error in internal.matlab.imagesci.nc/write (line 831)
netcdf.putVar(gid, varid,start, count, varData);
Error in ncwrite (line 75)
ncObj.write(varName, varData, start, stride);
He probado de distintas maneras y lo mas que me he acercado a lo que quiero obtener es si coloco:
ncwrite('etopo1-scar.nc','h',j(1:10801);
Nota: Mi matriz j que contiene los datos de mi variable mide 10801x21601
Con lo anterior obtengo la nueva variable h pero con los valores de j solo en la primera columna, Algo as:
60 9.96e+36 9.96e+36 9.96e+36 ...
54 9.96e+36 9.96e+36 9.96e+36 ...
53 9.96e+36 9.96e+36 9.96e+36 ...
13 9.96e+36 9.96e+36 9.96e+36 ...
70 9.96e+36 9.96e+36 9.96e+36 ...
23 9.96e+36 9.96e+36 9.96e+36 ...
34 9.96e+36 9.96e+36 9.96e+36 ...
. . . .
. . . .
. . . .
(adjunto mi pequeño código de principiante):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
% Llamo al archivo NetCDF
ncfile='/home/ahumada/roms-3.7/matlab/bathymetry/etopo1-scar.nc';
nc=netcdf(ncfile);
ncdisp(ncfile)
% extraigo las variables
lat=nc{'lat'}(:,:);
lon=nc{'lon'}(:,:);
topo=nc{'topo'}(:,:);
% Creo la nueva variable en el archivo (la variable se crea vacía)...
% se agrega la variable en el archivo original NetCDF))
nccreate('etopo1-scar.nc','h',...
'Dimensions',{'lon' 21601 'lat' 10801},...
'Format','classic');
% verifico que esté la nueva variable en el NetCDF
ncfile='/home/ahumada/roms-3.7/matlab/bathymetry/etopo1-scar.nc';
nc=netcdf(ncfile);
ncdisp(ncfile)
lat=nc{'lat'}(:,:);
lon=nc{'lon'}(:,:);
topo=nc{'topo'}(:,:);
h=nc{'h'}(:,:);
% creo el contenido de la nueva variable
j=topo;
% relleno la nueva variable
ncwrite('etopo1-scar.nc','h',j(1:10801);
% verifico el contenido final
ncfile='/home/ahumada/roms-3.7/matlab/bathymetry/etopo1-scar.nc';
nc=netcdf(ncfile);
ncdisp(ncfile)
lat=nc{'lat'}(:,:);
lon=nc{'lon'}(:,:);
topo=nc{'topo'}(:,:);
h=nc{'h'}(:,:);
Funciona solo con un dato, por ejemplo si mi VarData es 34, lo escribe en mi matriz j en el punto (m=1, n=1)
Y funciona con un vector (como está en mi script).
Cómo puedo establecer que mi VarData es una matriz y no un solo dato, o un vector?
Y que escriba toda la matriz j en mi variable llamada h (la cual mide lo mismo que j 10801x21601 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>> ncdisp(ncfile)
Source:
/home/ahumada/roms-3.7/matlab/bathymetry/etopo1-scar.nc
Format:
classic
Dimensions:
lat = 10801
lon = 21601
Variables:
lat
Size: 10801x1
Dimensions: lat
Datatype: double
lon
Size: 21601x1
Dimensions: lon
Datatype: double
topo
Size: 21601x10801
Dimensions: lon,lat
Datatype: double
h
Size: 21601x10801
Dimensions: lon,lat
Datatype: double
Gracias de antemano y espero haberme explicado...
Saludos cordiales
Mar.Mo.
Valora esta pregunta


0