高效实现Matlab';s";查找“;Julia函数

高效实现Matlab';s";查找“;Julia函数,matlab,search,optimization,find,julia,Matlab,Search,Optimization,Find,Julia,我试图在Julia中实现Matlab的Find函数。在Matlab中,代码是 find(A==0) 其中A是一个非常非常大的n×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 all

我试图在Julia中实现Matlab的Find函数。在Matlab中,代码是

find(A==0)
其中A是一个非常非常大的n×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都保持相同的大小,但变得更复杂,朱莉娅似乎很难找到零。有没有比我上面所做的更好的方法来实现Matlab的“Find”函数?

浏览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)

通过查看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)

只需编写
findall(iszero,A)
。为什么要执行所有其他步骤?只需编写
findall(iszero,A)
。你为什么要做这些其他的步骤?时间安排很奇怪。
为零是怎么回事?你试过几次了吗?是的,试过几次了,确实很奇怪。我运行了
@code\u native
,汇编代码之间有微小的差异(即使汇编指令的数量相差3条),所以这似乎不是随机的。这种时间安排非常奇怪。
为零是怎么回事?你试过几次了吗?是的,试过几次了,确实很奇怪。我运行了
@code\u native
,汇编代码中有微小的差异(即使汇编指令的数量相差3条),因此这似乎不是随机的。