我想遞歸地找到一系列矩陣中的最大值(第8列,具體),然后使用該最大值的索引來設置數組中的所有值,索引最大為NaN的最大索引(對于列14:16) . 很容易找到最大值和索引,但是使用for循環為多個數組做這件事我很難過 .
如果沒有for循環,我就可以這樣做:
[C,Max] = max(wy2000(:,8));
wy2000(1:Max,14:16) = NaN;
[C,Max] = max(wy2001(:,8));
wy2001(1:Max,14:16) = NaN;
[C,Max] = max(wy2002(:,8));
wy2002(1:Max,14:16) = NaN;
等等等等...
以下是我嘗試使用for循環的兩種方法:
startyear = 2000;
endyear = 2009;
for n=startyear:endyear
currentYear = sprintf('wy%d',n);
[C,Max] = max(currentYear(:,8));
currentYear(1:Max,14:16) = NaN;
end
這是我嘗試的另一種方法,使用eval函數
for n=2000:2009;
currentYear = ['wy' int2str(n)];
var2 = ['maxswe' int2str(n)];
eval([var2 ' = max(currentYear(:,8))']);
end
在這兩種情況下,問題似乎是MATLAB不能將'currentYear'變量識別為與我已在工作區中創建的wyXXXX對應的數組 .
根據Peters的回答,這里有一些關于我的數據的更多信息 . 我開始使用名為all_data的數據矩陣,其中包含16列數據,涵蓋1982年至2012年的時間段 . 我只對2000 - 2009年期間感興趣,我也有興趣每年分析(2000年,2001年) ,...,2009) .
為了將數據分成幾年,我使用以下代碼:
for n=2000:2009;
s = datenum(n-1,10,1);
e = datenum(n,9,30);
startcell = find(TIME(:,7)==s);
endcell = find(TIME(:,7)==e);
var1 = ['wy' int2str(n)];
eval([var1 '= all_data3(startcell:endcell,:)']);
eval(['save ', var1]);
end
為了澄清,我感興趣的是10/1 / YEAR1到9/30 / YEAR2期間,而TIME是一個包含數據日期和時間的矩陣 . 所以在上面的for-loop結束時,每個水年(wy)都有一個新的矩陣 . 然后,我想找到最大積雪的日期(第8列),并從我的分析中排除該日期之前的所有數據 . 這是原始問題的來源 .
Peter的解決方案有效,但我希望找到一個更簡單的解決方案來找到最大日期并將該日期之前的值設置為NaN,而不必聲明一堆變量(或單元數組中的條目) .
如果我可以編寫一個循環來創建Peter建議的基于開始和結束年份的單元格數組,那將使代碼可以轉移到其他數據集,但是當我嘗試這樣做時,我遇到的問題是索引為cell-array是1:length(years),但wy數組是根據實際年份命名的,因此使用eval函數時會出現不一致 .
馬特