【问题标题】:(Julia) Quickly make a column-wise sum over an array(Julia) 快速对数组进行逐列求和
【发布时间】:2019-11-03 01:44:42
【问题描述】:

我有一个 MxN 浮点数组 A,我想做以下操作: 对于 A 的每一列,计算小于某个阈值(例如 0.5)的元素的数量。

Julia 执行此操作的最快方法是用零初始化结果向量,然后逐列遍历数组 A 并在需要时递增结果向量。例如,使用 for 循环执行此操作很容易

function count(A)
    (cols, rows) = size(A)
    result = fill(0, cols)
    for j in 1:rows
        for i in 1:cols
            result[i] += A[i,j] <= 0.5
        end
    end
end

这会按照它在内存中的布局顺序遍历 A,并且它不会分配不需要的额外空间。但是,我不确定如何使用例如广播运营商来完成此操作。

sum(A .<= 0.5, dims=1)

但这分配新内存只是为了执行操作,并且比计数函数慢大约 2-3 倍(我对高达 8000x8000 的数组进行了测试)。只用几行代码就可以达到count-function的性能(如第二种方法)?

【问题讨论】:

    标签: arrays optimization multidimensional-array julia


    【解决方案1】:

    我写你的条件的一种自然方式是:

    count.(<=(0.5), eachcol(A))
    

    vec(sum(<=(0.5), A, dims=1))
    

    (后者比前者慢一点,但执行的分配要少得多,所以性能平衡可能取决于矩阵的维度)

    一般来说,两者都应该相当快且易于阅读。

    附带说明 - 您的代码按行而不是按列执行计数。这是纠正它以在列中执行计数的方法:

    function count2(A)
        (rows, cols) = size(A)
        result = fill(0, cols)
        for i in 1:cols
            for j in 1:rows
                result[i] += A[j,i] <= 0.5
            end
        end
        result
    end
    

    最后请注意,sum(A .&lt;= 0.5, dims=1) 执行的操作略有不同,因为它返回的是 Matrix 而不是 Vector

    【讨论】:

      猜你喜欢
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2019-01-25
      相关资源
      最近更新 更多