1

ここの多くのスレッドaccumarrayは、インデックス セットによって値をグループ化 (および計算) するための matlab の答えであることを示しています。これは高速で問題なく機能するため、より大きな (ND) データ フィールドには同様のものが必要です。
例を想定してみましょう: 内部に (一意ではない) 名前を持つ名前ベクトルと、列ごとに異なるプロジェクトの収益のデータ ベクトルがあります。

names=str2mat('Tom','Sarah','Tom','Max','Max','Jon');
earnings=[100 200 20;20 100 500;1 5 900; 100 200 200;200 200 0; 300 100 -250];

次に、各名前の列の合計を計算します。
さて、インデックスを見つけることができます

[namesuq,i1,i2]=unique(names,'rows')

しかしその後、明らかな呼び出し

accumarray(i2,earning)

動かない。もちろん、一意の名前または行に対して for ループを使用することもできますが、それは少し非効率的かもしれません。より良いアイデアはありますか?
さらに私は試しました

accumarray(i2,@(i)earnings(i,:))

しかし、これは実装されておらず、結果として

accumarray の使用エラー
2 番目の入力 VAL は、完全な数値、論理、文字ベクトルまたはスカラーでなければなりません。

アイデアをありがとう。

追加: eitan-tのソリューションに感謝します。これは、この例に最適です。
とても悲しいことに、私の最小限の作業例はすべてのニーズを示していませんでした: 私が適用したい関数は、行全体または後で完全な maxtrix を必要とし、3 番目またはそれ以上の次元でグループ化する必要があります。

M多分それをより明確にするために:サイズのマトリックスa x b x cと各エントリがa名前などに対応していると考えてください。私の必要性は、たとえば、すべての一意の名前を合計することで最もよく説明されています。
素朴なプログラミングは

nam=unique(names);
for ind=1:size(nam,2)
    N(ind,:,:)=sum(M(nam(ind)==names,:,:),1);
end

これは明らかですか?ここに解決策はありますか?

4

1 に答える 1

2

この回答に基づいて、探しているソリューションは次のとおりです。

[namesuq, i1, i2] = unique(names, 'rows');
[c, r] = meshgrid(1:size(earnings, 2), i2);
y = accumarray([r(:), c(:)], earnings(:));

行が一致する場所names(i1, :)

%// Sample input
names = str2mat('Tom', 'Sarah', 'Tom', 'Max', 'Max', 'Jon');
earnings = [100 200 20; 20 100 500; 1 5 900; 100 200 200; 200 200 0; 300 100 -250]

%// Sum along columns by names 
[namesuq, i1, i2] = unique(names, 'rows');
[c, r] = meshgrid(1:size(earnings, 2), i2);
y = accumarray([r(:), c(:)], earnings(:))

結果の合計は次のとおりです。

y =
   300   100  -250
   300   400   200
    20   100   500
   101   205   920

に対応するnames(i1, :):

ans =
    Jon  
    Max  
    Sarah
    Tom  
于 2013-08-27T11:27:05.380 に答える