首页 文章

Matlab - 访问for循环中最大值的索引,并使用它从数组中删除值

提问于
浏览
0

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

马特

1 回答

  • 2

    您已经发现了 eval 和动态命名变量的问题 . 他们建议将其重新编码为单元格数组,单元格数组索引是年份的索引:

    years = 2000:2009;
    wy{1} = wy2000;
    wy{2} = wy2001;
    % etc...
    
    % Then,
    for n=1:length(years)
        [C, maxval] = max(wy{n}(:,8));
        % etc.
    end
    

    当您输入数据和显示数据时,您实际上只需要实际的年份 . 现在,如果你're starting from a huge pile of arrays already named this way, that'是时候使用 eval :将它们转换成更容易使用的形式 . 只需形成eval字符串,以便他们阅读,例如, 'wy{1} = wy2000;'

相关问题