Octave:对索引元素求和

4
最简单的方式是通过示例来描述这个问题:

data = [1, 5, 3, 6, 10];
indices = [1, 2, 2, 2, 4];
result = zeroes(1, 5);

我希望result(1)data中索引为1的所有元素之和,result(2)data中索引为2的所有元素之和,以此类推。

当应用于具有64K个元素的向量时(将5更改为65535),此方法可行但速度非常慢:

result = result + arrayfun(@(x) sum(data(index==x)), 1:5);

我认为创建64K个具有64K元素的向量是导致时间消耗的原因。是否有更快的方法来完成这个任务?或者我需要想出一个完全不同的方法吗?


for i = [1:5]
    idx = indices(i);
    result(idx) = result(idx) + data(i);
endfor

但这样做并不太符合Octave的风格。
1个回答

3

由于MATLAB与Octave非常相似,我将提供在MATLAB R2016b上测试过的答案。查看Octave 4.2.1文档,语法应该是相同的。

你所需要做的就是:

result = accumarray(indices(:), data(:), [5 1]).'

这将会得到:

result =

     1    14     0    10     0

将数组转换为列向量(arrayName(:))是必要的,因为accumarray期望的输入。将结果指定为[5 1]的大小,然后转置结果是为了避免一些MATLAB错误。在MATLAB文档中也对accumarray进行了详细描述。

正是我想要的函数,而且我之前不知道它的存在。谢谢! - Geoff Horton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接