对向量中相同的元素进行分组和求和

Group and sum elements that are the same within a vector

假设我有一个看起来像这样的向量(数字将始终 > 0)...

[1, 2, 1, 4, 1, 2, 4, 3]

我需要一个矢量化实现,将数字相加并使用原始数字作为索引来存储数字。所以如果我 运行 我会得到...

% step 1
[1+1+1, 2+2, 3, 4+4]

% step 2
[3, 4, 3, 8]

我已经使用 for 循环实现了这一点,但我觉得有一种矢量化的方法可以实现这一点。我在向量化函数方面仍然很陌生,因此不胜感激。

这听起来像是 accumarray 的工作:

v = [1, 2, 1, 4, 1, 2, 4, 3];
result = accumarray(v(:), v(:)).'

result =

     3     4     3     8

其他方法:

  • 使用histcounts:

    x = [1, 2, 1, 4, 1, 2, 4, 3];
    u = unique(x);
    result = u.*histcounts(x, [u inf]);
    
  • 使用bsxfun(可能更占内存):

    x = [1, 2, 1, 4, 1, 2, 4, 3];
    u = unique(x);
    result = u .* sum(bsxfun(@eq, x(:), u(:).' ), 1);