首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(朱莉娅)在数组上快速地按列求和。

(朱莉娅)在数组上快速地按列求和。
EN

Stack Overflow用户
提问于 2019-11-02 15:07:42
回答 1查看 4.2K关注 0票数 4

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

朱莉娅最快的方法是用零初始化一个结果向量,然后在数组A列上运行,如果需要的话增加结果向量。例如,使用for循环很容易做到这一点。

代码语言:javascript
复制
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,它是内存中的布局,它没有分配不必要的额外空间。但是,我不知道如何使用例如广播运营商.<=0.5、sum等来完成这一任务。

代码语言:javascript
复制
sum(A .<= 0.5, dims=1)

但是这只分配了新的内存来执行操作,并且比计数函数慢2-3倍(我测试了它的数组达到8000x8000)。是否有可能实现计数函数的性能,但只使用几行代码(比如第二个方法)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-02 17:44:42

对我来说,写你的条件的一个自然方法是:

代码语言:javascript
复制
count.(<=(0.5), eachcol(A))

代码语言:javascript
复制
vec(sum(<=(0.5), A, dims=1))

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

一般来说,两者都应该是合理的快速和容易阅读。

顺便提一句--您的代码在行中执行计数,而不是在列中。这是纠正它以在列中执行计数的方法:

代码语言:javascript
复制
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 .<= 0.5, dims=1)执行的操作略有不同,因为它返回的是Matrix,而不是Vector

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58672335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档