ここの多くのスレッド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
これは明らかですか?ここに解決策はありますか?