0

嗨朋友我是matlab的新手。我想出了一个代码,它可以一次将所有 nc 文件转换为 mat 文件。我使用了一个 for 循环。一切都很好,我能够成功转换所有文件。但是有一个小缺点。所有文件都具有相同的变量名(出现在工作区中)。这需要手动重命名。我认为这是由于我的 matlab 语法限制。我把代码放在下面。如果您能提出一种方法,那就太好了。修复后,对于任何人来说,这将是真正节省代码的时间。

 %Author--  
 %converting nc file to mat file

 % Start_year = 1948;
 % End_year = 2012;
 rainfall_ncep_ncar= cell(1948, 2012);
  clear 
 for i=1948 : 2012
    % inputfile = strcat('prate.sfc.gauss.', num2str(i),'.nc');
    % disp(inputfile);
     rainfall_ncep_ncar{i} = strcat('rainfall_ncep_ncar', num2str(i));
    % disp(rainfall_ncep_ncar_{i});

    % disp(outfile);
    % disp(year);
    %clear other existing variables 
    %Output_filename = '../NCER_precipitation_rate_mat/rainfall_data_' +year;
    % check ='../NCER_precipitation_rate_mat/'inputfile;
     Input_path =strcat('../NCEP_precipitation_rate_nc/prate.sfc.gauss.',   num2str(i),'.nc');
    %display(Input_path);
    ncid = netcdf.open(Input_path, 'NC_NOWRITE');
   try
      prateId = netcdf.inqVarID(ncid, 'prate');
   catch exception 
      if strcmp(exception.identifier,'MATLAB:imagesci:netcdf:libraryFailure')
           str = 'prateId not found';
            end
   end 

   %disp(rainfall_ncep_ncar{i});
   rainfall = netcdf.getVar(ncid,prateId);
    %rainfall{i}= netcdf.getVar(ncid,prateId);
    Output_file = strcat('rainfall_ncep_ncar_', num2str(i),'.mat');
   %disp(Output_file);

   Output_path = strcat('f2/prate.sfc.gauss.', num2str(i),'.mat');
   save(Output_path, 'rainfall');
   disp(Output_path);
   disp('done');
   netcdf.close(ncid);
end
  clear

当我尝试使用

    rainfall_ncep_ncar{i}=netcdf.getVar(ncid,prateId);
    save(Output_path, 'rainfall_ncep_ncar{i}');

代替

    rainfall = netcdf.getVar(ncid,prateId);
    save(Output_path, 'rainfall');  

它显示以下错误

     run('H:\btp\mexnc files\nc_to_mat_all.m')
      Error using save
         'rainfall_ncep_ncar{i}' is not a valid variable name.

      Error in nc_to_mat_all (line 40)
         save(Output_path, 'rainfall_ncep_ncar{i}');

      Error in run (line 57)
         evalin('caller', [s ';']);

我想将每个文件(如 f2/prate.sfc.gauss.1948.mat)和工作区中的相应变量保存为 prate.sfc.gauss.1948 或 1948 或具有年份的东西。我该怎么做??

提前致谢 !!

4

1 回答 1

2

弹出该错误的原因很简单 -"'rainfall_ncep_ncar{i}' is not a valid variable name."如果不创建另一个变量,您将无法保存单个单元格。编辑: rainfall_ncep_ncar是工作区中的变量,但rainfall_ncep_ncar{i}不是,因此它不是保存的第二个参数的有效字符串。需要先将单元格提取到另一个变量(例如rainfall)中才能保存。

还有其他几点。

  1. 当您调用 时rainfall_ncep_ncar= cell(1948, 2012);,您正在制作一个到 2012 年大小为 1948 的二维元胞数组。从该元胞数组所代表的内容来看,这绝对不是您想要的!您想使用 cell 生成 2012 - 1948 大小为 1 的单元阵列。

  2. 为什么将每个单元格保存在不同的 mat 文件中?如果您稍后要使用它,在大多数情况下,您可能会更好地将循环末尾的单元格数组保存在一个 mat 文件中。事实上,在这种情况下,没有真正的理由使用元胞数组!

希望有帮助。

于 2013-10-16T00:24:45.020 回答