2013-10-15 70 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

相關問題