描述这个的最简单方法是通过示例:
result(1)
我希望data
为1
中索引为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
但这是非常非八度的方式。
答案 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