gpt4 book ai didi

arrays - 计算数组中与 Julia 中某些条件匹配的行的最快方法

转载 作者:行者123 更新时间:2023-12-01 09:47:08 29 4
gpt4 key购买 nike

在 Julia 中,我有一个这样的 bool 值数组:

3×5 Array{Bool,2}:
true false true false true
true true true true false
false false true true false

除了我有远远超过三行。例如,计算第二列和第四列为 true 的行数以及第二列和第三列为 true 的行数的最快/最佳方法是什么?现在我有这样的东西,其中 N 是行数:

num_2and3true = 0
num_2and4true = 0
for i = 1:N
if m[i,2] == 1
if m[i,3] == 1
num_2and3true += 1
end
if m[i,4] == 1
num_2and4true += 1
end
end
end

有没有更快的方法来做到这一点?我有一种预感,我这样做的方式太简单了,不是最好的方式。谢谢....

最佳答案

题中的计算确实很简单,也很优化。我发现的一个小改进是:

num_2and3true = 0
num_2and4true = 0
for i = indices(m,1)
num_2and3true += Int(m[i,2] && m[i,3])
num_2and4true += Int(m[i,2] && m[i,4])
end

它在我的机器上快了大约 20%。可能是因为减少了分支。为了进行测试,我使用了随机的 m,但对于特定的 m(大小和内容),结果可能会有所不同。

为了更好的性能,在 for 之前添加一个 @inbounds,这可以避免数组访问中的一些越界错误检查:

@inbounds for i = indices(m,1)

更好的是,也添加@simd,以便尽可能利用 CPU 对 SIMD 指令的支持:

@inbounds @simd for i = indices(m,1)

导致:

num_2and3true = 0
num_2and4true = 0
@inbounds @simd for i = indices(m,1)
num_2and3true += Int(m[i,2] && m[i,3])
num_2and4true += Int(m[i,2] && m[i,4])
end

这比有问题的版本快 10 倍(同样,在我的机器上)。

更新:请参阅评论以了解 indices(m,1) 优于 1:size(m,1) 的原因。

更新:将 Bool 转换为 0/1 整数(感谢 DNF 的评论),使代码更加清晰。

使用不同的方法添加了另一个答案(速度提高了 3 倍)。这个答案可能更清楚。

关于arrays - 计算数组中与 Julia 中某些条件匹配的行的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46283219/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com