【问题标题】:Group and sum elements that are the same within a vector对向量中相同的元素进行分组和求和
【发布时间】:2017-05-08 02:41:20
【问题描述】:

假设我有一个看起来像这样的向量(数字总是 > 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 循环实现了这一点,但我觉得有一种矢量化的方式来实现这一点。我在矢量化函数方面还很陌生,因此不胜感激。

【问题讨论】:

    标签: matlab math octave vectorization


    【解决方案1】:

    这听起来像是accumarray 的工作:

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

    【讨论】:

      【解决方案2】:

      其他方法:

      • 使用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);
        

      【讨论】:

      • 如果范围小而数字大,那么 histcounts 是一种合理的方法,其次,任何零都不是戏剧性的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多