2017-06-12 1 views
1

J'ai une fonction qui génère yout_new (5000,1) à chaque itération et je veux stocker ces données dans un fichier netcdf et ajouter les nouvelles données générées à chaque itération dans cette itération. fichier existant. À la deuxième itération, la taille de la variable stockée doit être yout_new (5000,2). Voici mon essai qui ne fonctionne pas. Est-ce qu'il y a une bonne façon de le faire?Ajouter des données au format Netcdf de tableau 2D Matlab

  neq=5000; 
      filename='thrust.nc'; 
      if ~exist(filename, 'file') 
       %% create file 
       ncid=netcdf.create(filename,'NC_WRITE'); 

       %%define dimension 
       tdimID = netcdf.defDim(ncid,'t',... 
          netcdf.getConstant('NC_UNLIMITED')); 
       ydimID = netcdf.defDim(ncid,'y',neq); 
       %%define varibale 
       varid = netcdf.defVar(ncid,'yout','NC_DOUBLE',[ydimID tdimID]); 
       netcdf.endDef(ncid); 

       %%put variables from workspace (i is the iteration) 

       netcdf.putVar(ncid,varid,[ 0 0 ],[ neq 0],yout_new); 

       %%close the file 
       netcdf.close(ncid); 

      else 
       %% open the existing file 
       ncid=netcdf.open(filename,'NC_WRITE'); 

       %Inquire variables 
       [varname,xtype,dimids,natts] = netcdf.inqVar(ncid,0); 
       varid = netcdf.inqVarID(ncid,varname); 

       %Enquire current dimension length 
       [dimname, dimlen] = netcdf.inqDim(ncid,0); 

       % Append new data to existing variable. 

      netcdf.putVar(ncid,varid,dimlen,numel(yout_new),yout_new); 
       netcdf.close(ncid); 

Répondre

1

Il existe des fonctions plus simples dans MATLAB, pour gérer netCDF. Vous lisez sur ncdisp, ncinfo, nccreate, ncread, ncwrite. Venant à la question, vous avez dit que vous devez écrire deux colonnes, je vais prendre le nombre de colonnes comme variable (infini), chaque fois que vous pouvez ajouter les colonnes. Vérifiez le code ci-dessous:

N = 3 ; % number of columns 
rows = 5000 ; % number of rows 
ncfile = 'myfile.nc' ; % my ncfile name 
nccreate(ncfile,'yout_new','Dimensions',{'row',rows,'col',Inf},'DeflateLevel',5) ; % creat nc file 
% generate your data in loop and write to nc file 
for i = 1:N 
    yout_new = rand(rows,1) ; 
    ncwrite(ncfile,'yout_new',yout_new,[1,i]) ; 
end 

S'il vous plaît pas, il est pas obligatoire de faire nombre de colonnes comme illimité, vous pouvez le fixer à votre numéro désiré au lieu de inf.

+0

Merci mate! ... fonctionne bien ... Y at-il une option supplémentaire dans nccreate qui vous permet d'écraser le fichier existant ... actuellement j'utilise si exist() tester et supprimer le fichier .. –

+0

Non _nccreate_ doesn pas cette option. Allez-y avec _exist_ .. –