使用具有变量输入的名称保存matlab文件

时间:2013-10-15 21:24:33

标签: matlab variables eval cell

朋友们,我是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或具有年份的东西。我该怎么办?

提前致谢!!

1 个答案:

答案 0 :(得分: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的二维单元阵列。从这个单元阵列所代表的位置来看,这绝对不是你想要的!您希望使用单元格生成2012 - 1948 x 1单元格的单元格。

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

  3. 希望有所帮助。