Octave:对索引元素求和

时间:2017-03-20 11:26:41

标签: indexing sum octave vectorization binning

描述这个的最简单方法是通过示例:

result(1)

我希望data1中索引为result(2)data的所有元素的总和,为{{1}中所有元素的总和索引为2等等。

这可行,但在应用(将5更改为65535)到64K元素向量时非常慢:

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

但这是非常非八度的方式。

1 个答案:

答案 0 :(得分:2)

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

您需要做的就是:

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

给出了:

result =

     1    14     0    10     0

由于arrayName(:)的预期输入,因此需要重新整形为列向量(accumarray)。将大小指定为[5 1]然后转置结果以避免一些MATLAB错误。

accumarray也在MATLAB documentation

中进行了深入介绍