2013-10-15 41 views
0

您好朋友我是matlab新手。我想出了一个代码,它可以在一回合中将所有nc文件转换为mat文件。我使用了一个for循环。一切都很好,我可以成功转换所有文件。但是有一个小缺点。所有文件具有相同的变量名称(出现在工作区中)。这需要手动重命名。我认为这是由于我的matlab语法限制。我在下面放置代码。如果你能提出一个方法,这将是非常棒的。修复后,这将是真正节省时间的代码给任何人。保存具有可变输入名称的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年或某年。我该怎么做??

在此先感谢!

+0

在每次迭代中将数据保存到文件中,因此不需要将数据存储为单元阵列。为什么你不能在所有的迭代中使用相同的变量'降雨量'(没有{i}):保存当前的数据,并用新数据运行下一次迭代时的“降雨量”,并保存等等。 – Adiel

+0

没有测试我会说只是使用'保存(Output_path,rainfall_ncep_ncar {i});'没有''' – thewaywewalk

+0

不回答你的问题,但'sprintf('f2/prate.sfc.gauss。%d.mat',我)'而不是strcat会增加你的代码的可读性。顺便说一句,''rainfall_ncep_ncar {i}''不是工作区中变量的名称('''rainfall_ncep_ncar'是'变量的名称'),但我仍然没有得到通过增加复杂性的观点使用单元格阵列,因为你的问题更多地是关于文件名... – Pascail

回答

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);,你这是1948年大小的二维单元阵列在2012年通过什么单元阵列代表来看,这绝对不是你想要的!你想用单元格生成一个大小为1的单元格阵列的2012 - 1948。

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

希望有所帮助。

+0

我很抱歉,但你的陈述“你不能保存单个单元格而没有创建另一个变量。”问题是错误的。这不是正在发生的事情。字符串''rainfall_ncep_ncar {i}''对于'save'来说不是一个有效的字符串。MATLAB甚至不检查是否存在'rainfall_ncep_ncar'。该字符串不是有效的变量名称。你会得到'fake_nonexistent_cell {i}'的_exact_相同的错误。继续解释,首先需要提取单元格,因为这是事实,但是您对错误的解释并不完全正确。 – chappjc

+0

对不起,我没有选择发表评论的帖子:P,如果我做了我会。你是对的,我没有提供完整的解释,我将把它编辑成我的答案。您的答案不正确,因为要保存的第二个参数是变量的字符串名称,所以删除'是不正确的。 – user2816823

+0

我删除了我的评论,因为你现在正在解释它。但请注意,循环中的第一行代码('rainfall_ncep_ncar {i} = strcat('rainfall_ncep_ncar',num2str(i));')将'rainfall_ncep_ncar'定义为字符串*的单元格数组*,因此语法无效'。但是,由于OP后面给出了'rainfall_ncep_ncar {i} = netcdf.getVar(ncid,prateId)',所以这行代码是误导性的,因为它解释了主代码下面的问题。对于这个数据来说,你是对的,它不会是一个字符串,并且有必要首先将单元格内容提取到另一个变量中。和+1! :) – chappjc

相关问题