2

ベクトルがあるとします:

 y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03];
 c = [0 0    0    0    1 1    1    2 2    2    2   ];

「グループ化平均」、つまり のy一意の値ごとの の平均値を取得するベクトル化された方法はありcますか? (これは単純化された例です。似たようなものがありますが、ベクトルのサイズは数千で、c の値は数百あります)

ベクトル化できるかどうか疑問に思っているだけで、for ループで実行できます。これが私の for ループの実装です。

function [my,mc] = groupmean(y,c)
my = [];
mc = [];
for ci = unique(c)'
    mc(end+1) = ci;
    my(end+1) = mean(y(c==ci));
end
4

1 に答える 1

6

簡潔な答え:

>> y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03];
>> c = [0 0    0    0    1 1    1    2 2    2    2   ];
>> groupmeans = accumarray(c'+1,y',[],@mean)
groupmeans =
        1.015
         2.01
        3.015

上記を説明するには:accumarray少し難解ですが、非常に便利で、知る価値があります (そして非常に迅速に)。最初の入力は、2 番目の入力ベクトルの行をグループ化するベクトル (列ベクトルである必要があるため、c'andです) です。y'要素は (何らかの理由で) 正の整数である必要があるため、 に 1 を追加しましたc'。最後の入力は、y の値の各グループにアキュムレータとして適用される関数のハンドルです。

それが理にかなっていることを願っています!そうでない場合doc accumarray:)

于 2012-05-30T13:43:51.710 に答える