我有一个浮标的MxN数组A,我想做以下操作:对于A的每一列,计算小于某个阈值的元素数(例如,0.5)。
朱莉娅最快的方法是用零初始化一个结果向量,然后在数组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,它是内存中的布局,它没有分配不必要的额外空间。但是,我不知道如何使用例如广播运营商.<=0.5、sum等来完成这一任务。
sum(A .<= 0.5, dims=1)但是这只分配了新的内存来执行操作,并且比计数函数慢2-3倍(我测试了它的数组达到8000x8000)。是否有可能实现计数函数的性能,但只使用几行代码(比如第二个方法)?
发布于 2019-11-02 17:44:42
对我来说,写你的条件的一个自然方法是:
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 .<= 0.5, dims=1)执行的操作略有不同,因为它返回的是Matrix,而不是Vector。
https://stackoverflow.com/questions/58672335
复制相似问题