高效实现Matlab';s";查找“;Julia函数
我试图在Julia中实现Matlab的Find函数。在Matlab中,代码是高效实现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
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条),因此这似乎不是随机的。