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 对应的数组。

根据彼得斯的回答,这里有一些关于我的数据的更多信息。我从一个名为 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 循环的末尾,我为每个水年(wy)创建了一个新矩阵。然后我想找到最大积雪的日期(第 8 列),并从我的分析中排除该日期之前的所有数据。这就是原始问题的来源。

彼得的解决方案有效,但我希望找到一个更简单的解决方案来查找最大日期并将该日期之前的值设置为 NaN,而无需声明一堆变量(或单元格数组中的条目)。

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

马特

4

1 回答 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

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

于 2013-08-20T21:42:59.797 回答