我想递归地找到一系列矩阵中的最大值(第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函数时会出现不一致 .
马特