0

1年分のデータがあれば

Jday = datenum('2010-01-01 00:00','yyyy-mm-dd HH:MM'):1/24:...
    datenum('2010-12-31 23:00','yyyy-mm-dd HH:MM');
dat = rand(length(Jday),1);

「dat」の月間平均を計算したい場合は、次を使用します。

% monthly averages
dateV = datevec(Jday);
[~,~,b] = unique(dateV(:,1:2),'rows');
monthly_av = accumarray(b,dat,[],@nanmean);

しかし、日中、つまり 6 時間から 18 時間の間に発生するポイントの月平均を計算したいのですが、どうすればよいでしょうか?

月平均で使用したい時間を分離できます。

idx = dateV(:,4) >= 6 & dateV(:,4) <= 18;

次に、「b」を変更して、次の方法でこれらのポイントのみを含めることができます。

b(double(idx) == 0) = 0;

次に、平均を計算します

monthly_av_new = accumarray(b,dat,[],@nanmean);

しかし、これは機能しません。accumarray は正の整数でしか機能しないため、エラーが発生します。

accumarray 使用時のエラー 最初の入力 SUBS には、正の整数の添え字が含まれている必要があります。

私が概説したことを行うための最良の方法は何でしょうか? これを行うときに変数「dat」を変更したくないことに注意してください。つまり、平均を計算する前に「dat」からいくつかの値を削除します。

考えてみると、最善の解決策は

month_av = accumarray(b(idx),dat(idx),[],@nanmean);

4

1 に答える 1

1

あなたはほとんどそれを持っています。idxinbおよび in で論理インデックスを使用するだけdatです。

monthly_av_new = accumarray(b(idx),dat(idx),[],@nanmean);

(そして、行b(double(idx) == 0) = 0;はもう必要ありません)。

このようにb(idx)して、目的の時間間隔に対応するインデックスのみがdata(idx)含まれ、対応する値が含まれます。

編集: 既に解決策を見つけているようです! はい、それが最善の方法だと思います。

于 2013-10-26T14:07:29.260 に答える