0

生成された月次データと比較する必要がある日次データを観察したので、30 年間の各月の平均を取得する必要があります。

私の観測データセットは現在 365x31 で、行は毎日 (うるう年はありません!)、余分な列は月番号 (1-12) です。

私が抱えている問題は、すべての年の平均を取得するためのスクリプトしか取得できないように見えることです。すなわち。スクリプトを各列に対して個別に実行する方法がわかりません。データの例は次のとおりです。

1    12    14
1    -15   10
2    13    3
2    2     37
...all the way to 12 for 365 rows

SO: 要約すると、[12; の平均値を取得する必要があります。-15; 13; 2] 次に [14; 10; 3; 37]など。

unique() 関数を使用してループを試みましたが、これは行数を平均化するために機能しますが、手段が正しくありません。今、私は毎月(28〜31行)と列を個別に行う必要があります。結果は 12x30 の行列になります。シンプルなものが欠けているような気がします。コード:

u = unique(m); %get unique values of m (months) ie) 1-12

for i=1:length(u)
   month(i) = mean(obatm(u(i), (2:31)); % the average for each month of each year
end

どんなアイデアでも大歓迎です!ありがとう!

4

1 に答える 1

2

mean次のように、各月の行を単純にフィルターして適用できます。

month = zeros(12, size(obatm, 2));
for k = 1:12
    month(k, :) = mean(obatm(obatm(:, 1) == k, :));
end

編集:
何か派手なものが必要な場合は、これを行うこともできます:

cols = size(obatm, 2) - 1;
subs = bsxfun(@plus, obatm(:, 1), (0:12:12 * (cols - 1)));
vals = obatm(:, 2:end);
month = reshape(accumarray(subs(:), vals(:), [12 * cols, 1], @mean), 12, cols)

ほら、ママ、ループじゃない!

于 2013-01-31T20:53:16.633 に答える