【问题标题】:Octave: summing indexed elementsOctave:对索引元素求和
【发布时间】:2017-08-11 15:50:33
【问题描述】:

最简单的描述方式是通过示例:

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

我希望result(1)data 中所有元素的总和,其索引为1result(2)data 中所有元素的总和,其索引为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

但这是一种非常非八度音阶的方式。

【问题讨论】:

    标签: indexing sum octave vectorization binning


    【解决方案1】:

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

    您需要做的就是:

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

    这给出了:

    result =
    
         1    14     0    10     0
    

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

    accumarrayMATLAB documentation中也有深入描述

    【讨论】:

    • 正是我想要但不知道存在的功能。谢谢!
    猜你喜欢
    • 2011-12-28
    • 2014-10-26
    • 1970-01-01
    • 2023-03-03
    • 2020-11-17
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多