【问题标题】:Efficiently implementing Matlab's "Find" function in Julia在 Julia 中高效实现 Matlab 的“查找”功能
【发布时间】:2020-12-01 23:59:20
【问题描述】:

我正在尝试在 Julia 中实现 Matlab 的 Find 功能。在Matlab中,代码是

find(A==0)

其中 A 是一个非常非常大的 n x m 矩阵,我在其中迭代和更新上述一系列大约 500 个步骤。在 Julia 中,我通过

[findall(x->x==0, D_tot)[j][2] for j in 1:count(x->x==0,D_tot)]

这似乎工作得很好,除了随着我的迭代进展它变得非常缓慢。例如,对于第一步,@time 产生

0.000432 seconds (33 allocations: 3.141 KiB)

第 25 步:

0.546958 seconds (40.37 k allocations: 389.997 MiB, 7.40% gc time)

第 65 步:

1.765892 seconds (86.73 k allocations: 1.516 GiB, 9.63% gc time)

在每一步中,A 的大小都保持不变,但变得更加复杂,而 Julia 似乎很难找到零点。有没有比我上面做的更好的方法来实现 Matlab 的“查找”功能?

【问题讨论】:

  • 只写findall(iszero, A)。你为什么要执行所有这些其他步骤?

标签: matlab search optimization find julia


【解决方案1】:

通过 Matlab 文档我了解到您想要查找

"一个包含数组 X 中每个非零元素的线性索引的向量"

非零是指Matlab表达式A==0中的真值

在这种情况下,这可以实现为

findall(==(0),vec(D_tot))

还有一个小基准:

D_tot=rand(0:100,1000,1000)
using BenchmarkTools

跑步:

julia> @btime findall(==(0), vec($D_tot));
  615.100 μs (17 allocations: 256.80 KiB)

julia> @btime findall(iszero, vec($D_tot));
  665.799 μs (17 allocations: 256.80 KiB)

【讨论】:

  • 那个时机很奇怪。 iszero 是怎么回事?你试过几次?
  • 是的几次,确实很奇怪。我运行@code_native,汇编代码有微小的差异(甚至汇编指令的数量也相差3)——所以这似乎不是随机的。
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2020-07-10
  • 2018-04-13
  • 2011-06-20
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多