1

accumarray 関数を使用して、ベクトル「id」で定義されたカテゴリ内のベクトル「データ」の値を合計しています。ベクター ID が必ずしもソートされているわけではなく、連続していない番号が含まれている可能性もあります。また、(unique(id) と同じサイズではなく) id と同じサイズの合計 Sij のベクトルを取得したいと考えています。

例えば

id = [3 2 4 3 2 3]';
data = [6 43 3 4 2 5]';

私が望む出力として

Sij = [15 45 3 15 45 15]';

データセットを作成し、結合関数を使用して (次のコードを使用して) 何とかそれを行うことができましたが、より効率的な方法があるかどうか疑問に思っていました (これは私が最大化している可能性関数の一部であり、速度を上げたいと考えています) )。ありがとう!

clear;
id = [3 2 4 3 2 3]';
data = [6 43 3 4 2 5]';
indices = [id ones(size(id))];
S = accumarray(indices, data);
DS  = dataset((1:size(S))',S);
DS = DS(DS.S~=0,:);
DS.Properties.VarNames={'id','S'};
C =join(dataset(id),DS);
Sij = C.S;
4

1 に答える 1

2

基本的に の出力を複製する必要がありますaccumarray。複製パターンは、次の 3 番目の出力によって与えられますunique

[~, ~, k] = unique(id);
s = accumarray(k,data);
result = s(k);

別の可能性: を使用bsxfunして の等しい値を検出しid、次に行列の乗算を使用して の対応する値を累積しますdata

result = bsxfun(@eq, id, id.') * data;

テストして、どのアプローチが最も速いかを確認してください。

于 2014-06-10T21:53:35.330 に答える