Matlab - loop para netcdf

   
Vista:

loop para netcdf

Publicado por Maite (1 intervención) el 03/08/2016 15:43:46
hola! tengo centenas de ficheros netcdf y quiero crear un bucle que los lea, extraiga el dato que quiero trabajar de forma matricial y no me sale. Después tengo que hacer un recorte para trabajar solo en la zona de interes. Hasta ahora tengo hecho este codigo:

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
% Specify the folder where the files are.
myFolder = 'G:\SWICCA\DATA_validation\ESA\data\daily_files\COMBINED\v02.2\2010\files';
 
% Check to make sure that folder actually exists.  Warn user if it doesn't.
if ~isdir(myFolder)
  errorMessage = sprintf('Error: The following folder does not exist:\n%s', myFolder);
  uiwait(warndlg(errorMessage));
  return;
end
 
% Read the names of nc-files in the folder 
ncfiles = dir('*.nc') ;
Nfiles = length(ncfiles) ;
 
% Loop for each nc-file
for i = 1:Nfiles
    ncid=netcdf.open('ncfiles', 'NC_NOWRITE');
    varname= netcdf.inqVar(ncid(i),4);
    varid = netcdf.inqVarID(ncid(i),varname(i));
    data(i) = netcdf.getVar(ncid(i),varid(i));
    netcdf.close(ncid(i));
end
 
lon1=netcdf.getVar(ncid,0,0,1440);
lat1=netcdf.getVar(ncid,1,0,720);
 
%crop to interest area
[longrid,latgrid]=meshgrid(lon1,lat1);
data2=data((longrid>-1)&(longrid<0)&(latgrid>39)&(latgrid<40));



Pero lo de dentro del bucle no funciona, he conseguido hacer el proceso para un solo fichero y funciona:

1
2
3
4
5
6
7
8
9
10
ncid1=netcdf.open('ESACCI-SOILMOISTURE-L3S-SSMV-COMBINED-20100101000000-fv02.2.nc', 'NC_NOWRITE');
varname = netcdf.inqVar(ncid1,4);
varid = netcdf.inqVarID(ncid1,varname);
data = netcdf.getVar(ncid1,varid);
lon1=netcdf.getVar(ncid1,0,0,1440);
lat1=netcdf.getVar(ncid1,1,0,720);
 
%crop to interest area
[longrid,latgrid]=meshgrid(lon1,lat1);
data2=data((longrid>-1)&(longrid<0)&(latgrid>39)&(latgrid<40));

gracias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO

loop para netcdf

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 03/08/2016 17:00:42
Falta informacion:
Deberías subir por lo menos tres de archivos *.nc.

http://www.lawebdelprogramador.com/foros/Matlab/1558889-Solucion-de-ecuaciones-complejas-en-matlab.html

Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online en Matlab
Programador en Matlab
Servicios de programación matlab
jjcc94@hotmail.com
El correo es para servicios de programación, toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

loop para netcdf

Publicado por Miguel (31 intervenciones) el 16/08/2016 19:27:12
% Hola Mayte espero que ésto ayude un poco


% Loop for each nc-file
for i = 1:Nfiles
ncid=netcdf.open(ncfiles(i).name, 'NC_NOWRITE');
%ncid=netcdf.open('ncfiles', 'NC_NOWRITE');
varname= netcdf.inqVar(ncid,4);
%varname= netcdf.inqVar(ncid(i),4);
varid = netcdf.inqVarID(ncid(i),varname);
%varid = netcdf.inqVarID(ncid(i),varname(i));
data(i) = netcdf.getVar(ncid(i),varid);
%data(i) = netcdf.getVar(ncid(i),varid(i));
netcdf.close(ncid);
%netcdf.close(ncid(i));
end


%Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JOSE JEREMIAS CABALLERO

loop para netcdf

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3433 intervenciones) el 16/08/2016 19:34:54
El programa ya está hecho,según está preguntando Mayte, el detalle es yo hecho el programa para otros archivos *.nc y probado con otros tipos de archivos *.nc. Por eso justo le pido dos o mas archivos *.nc a Mayte para poder ejecutarlo con el archivo de *.nc exacto y ver los posibles errores y de esa manera subir un código exacto para lo que está preguntando.

Saludos.
JOSE JEREMÍAS CABALLERO
Asesoría online en Matlab
Programador en Matlab
Servicios de programación matlab
jjcc94@hotmail.com
El correo es para servicios de programación, toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Dave

loop para netcdf

Publicado por Dave correa.dave30@gmail.com (934 intervenciones) el 17/08/2016 17:59:12
Hola Maite

En tu caso te sugiero que tanto la extracción de tus datos del archivo netcdf como la extracción del área especifica lo hagas a través de una función Matlab, de esta manera sería más eficiente.

Te copio una función que desarrolle para extraer información de datos satelitales.


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
function [fecha,LAT,LON,VX,VY,VEL] = leer_vientos(fname,latmin,latmax,lonmin,lonmax);
 
% Área de extracción de información
% latmax = xx;     % Extremo norte
% latmin = xx;   % Extremo sur
% lonmax = xx;     % Extremo este
% lonmin = xx;   % Extremo oeste
 
% Lee la fecha del archivo
fecha = double(ncread(fname,'time')/24 + datenum(1900,1,0));
 
% Lee los datos de latitud
LAT = ncread(fname,'latitude');
idla = find(and(LAT>=latmin,LAT<=latmax));
LA = LAT(idla);
 
% Lee los datos de longitud
LON = ncread(fname,'longitude');
idlo = find(and(LON>=lonmin,LON<=lonmax));
LO = LON(idlo);
 
[LAT,LON] = meshgrid(double(LA),double(LO));
 
% Lee los datos de viento (X)
vx = ncread(fname,'eastward_wind');
VX = vx(idlo,idla);
 
% Lee los datos de viento (Y)
vy = ncread(fname,'northward_wind');
VY = vy(idlo,idla);
 
VEL = double(sqrt(VX .^2 + VY.^2));

​Espero que sea de alguna ayuda.

Saludos
Dave Correa
correa.dave30@gmail.com
dcorrea@fismatlab.org
Servicios de Programación Matlab
http://fismatlab.org​​
http://fismatlab.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar