1

我正在使用 accumarray 函数对向量“id”定义的类别中的向量“数据”中的值求和。我希望我的向量 id 不一定要排序,也可能包含不连续的数字。我还想得到一个与 id 大小相同(而不是 unique(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. 复制模式由以下的第三个输出给出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 回答