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

Matlab-访问for循环中最大值的索引,并使用它从数组中删除值,matlab,for-loop,eval,printf,Matlab,For Loop,Eval,Printf,我希望递归地在一系列矩阵(具体来说是第8列)中找到最大值,然后使用该最大值的索引将数组中的所有值设置为NaN(对于第14:16列),索引为max index。查找最大值和索引很简单,但使用for循环对多个数组执行此操作却让我感到困惑 下面是我如何在没有for循环的情况下完成它: [C,Max] = max(wy2000(:,8)); wy2000(1:Max,14:16) = NaN; [C,Max] = max(wy2001(:,8)); wy2001(1:Max,14:16) = NaN;

我希望递归地在一系列矩阵(具体来说是第8列)中找到最大值,然后使用该最大值的索引将数组中的所有值设置为NaN(对于第14:16列),索引为max index。查找最大值和索引很简单,但使用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;
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
诸如此类

以下是我尝试使用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;
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,时间是一个矩阵,包含我数据的日期和时间。 因此,在上述for循环的末尾,我为每个水年(wy)创建了一个新的矩阵。然后我想找出最大积雪的日期(第8列),并从分析中排除该日期之前的所有数据。这就是原始问题的来源

Peter的解决方案是可行的,但我希望找到一个更简单的解决方案,找到最大日期并将该日期之前的值设置为NaN,而不必声明一组变量(或单元格数组中的条目)

如果我可以写一个循环,创建Peter建议的基于起始年和结束年的单元格数组,这将使代码可以转移到其他数据集,但当我尝试这样做时,我遇到了一个问题,单元格数组的索引是1:length(years),但wy数组是根据实际年份命名的,因此,使用eval函数时存在不一致性


Matt

您发现了
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

当您输入数据和显示数据时,实际上只需要实际年份。现在,如果您从一大堆已经以这种方式命名的数组开始,那么现在就可以使用
eval
:将它们转换为更易于使用的形式。只需形成eval字符串,使其读取,例如,
'wy{1}=wy2000;'

完全正确。变量名不应用于存储数据(本例中为年份)!Peter-该解决方案确实有效,但看起来仍然相当麻烦。我仍然需要定义wy{1}=wy2000…wy{10}=wy2009单元数组。到那个时候,我还不如按照上面概述的方式来做,而不使用for循环。我将提供更多关于我从何处开始的信息。@cooper先生不!首先,您不会因为错误的数据组织而在这里浪费时间。因此,帮自己一个忙,纠正核心的数据生成。避免
eval()
@OlegKomarov我同意,我想纠正核心错误的数据组织。如果你对如何做有建议,请分享。我是一个初学者,但似乎应该有一个非常简单的方法来完成我的要求。当然,在一组按顺序命名的数组中循环并对每个数组执行操作是非常常见的,但是使用Matlab来访问循环中使用数组名称的数组似乎很困难。我意识到我从根本上遗漏了一些东西——你能解释一下我的核心哪里出了问题吗?@Peter在使用单元阵列执行其他操作后,我发现从一开始创建单元阵列的效果会更好。例如,我能够编写一个循环,使用来自不同单元格数组的列执行多重线性回归。谢谢你,彼得!避免评估的一般方法:@OlegKomarov谢谢你的链接。作为初学者,Matlab不能很好地处理动态命名的变量,这似乎很奇怪。但我已经开始看到细胞阵列系统的优势。