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 ループを使用して試した 2 つの方法を次に示します。

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

どちらの場合も、ワークスペースで既に作成した wyXXXX に対応する配列として MATLAB が 'currentYear' 変数を認識しないことが問題のようです。

Petersの回答に基づいて、ここに私のデータに関する詳細情報があります。1982 年から 2012 年までの 16 列のデータを保持する all_data というデータのマトリックスから始めます。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 に設定するためのより簡単な解決策を見つけたいと思っていました。

ピーターが開始年と終了年に基づいて提案したセル配列を作成するループを作成できれば、コードを他のデータセットに転送できるようになりますが、これを実行しようとすると、 cell-array は 1:length(years) ですが、wy 配列は実際の年に従って名前が付けられているため、eval 関数を使用すると矛盾が生じます。

マット

4

1 に答える 1