我使用accumarray函数对矢量“id”定义的类别中的矢量“data”中的值求和。我希望我的矢量id不必排序,也可能包含非连续数字。我还希望最终得到一个与SID相同的矢量Sij(而不是相同的唯一(id)大小)。
例如
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;
答案 0 :(得分:2)
您基本上需要复制accumarray
的输出。复制模式由unique
的第三个输出:
[~, ~, k] = unique(id);
s = accumarray(k,data);
result = s(k);
另一种可能性:使用bsxfun
检测id
的相等值,然后使用矩阵乘法来累加data
的相应值:
result = bsxfun(@eq, id, id.') * data;
测试哪种方法最快。