allclose - 如何在Julia中检查两个数组是否接近

SPV*_*SPV 5 numpy julia

在numpy中,您可以np.allclose(A, B)查看阵列A和B是否接近.

朱莉娅有没有这样做的功能?

use*_*730 11

(对于此答案的过时版本,请参阅下面的水平线.)

在Julia 0.4 isapprox引入了一个数组版本,所以你现在可以写:

isapprox(A, B)
Run Code Online (Sandbox Code Playgroud)

与标量情况一样,您可以将相对容差rtol和绝对容差指定atol为关键字参数.

但请注意,与NumPy allclose(以及下面此答案的先前解决方案)不同,array- isapprox首先计算一个范数,然后决定结果值.(显然,逐点检查是错误的isapprox.)默认情况下,使用Frobenius规范(vecnorm),但您可以使用norm关键字参数覆盖此行为.

顺便说一句,正如链接拉取请求中所提到的,在测试中你可以编写@test isapprox(A, B),所以@test_approx_eq现在已经过时并且不推荐使用0.6.此外,还有A ? B,它isapprox(A, B)可以像任何比较运算符一样使用和使用:a < b ? c ? d.


作为参考,这是此帖子的先前过时版本:

对于单个数字,isapprox定义.如果你想将它扩展到Arrays 上的元素比较,你可以使用:

all(x -> isapprox(x...), zip(A, B))

all(x -> isapprox(x...), zip(A, A + 1e-5)) # => false
all(x -> isapprox(x...), zip(A, A + 1e-6)) # => true
Run Code Online (Sandbox Code Playgroud)


jub*_*0bs 6

没有allclose与Julia一起发布的函数:

julia> allclose
ERROR: allclose not defined
Run Code Online (Sandbox Code Playgroud)

我不知道现有的Julia函数是否提供了您想要的功能,但根据numpy.allclose文档,您可以自己实现(完成关键字参数):

function allclose(a, b; rtol = 1e-5, atol = 1e-8)
  return all(abs(a - b) .<= (atol + rtol * abs(b)))
end
Run Code Online (Sandbox Code Playgroud)

Julia命令行的测试:

julia> A = rand(5, 5)
5x5 Array{Float64,2}:
 0.0833821  0.722352   0.474616  0.0997349  0.352403 
 0.557657   0.199624   0.748646  0.838296   0.0396182
 0.9716     0.230623   0.215245  0.689457   0.261951 
 0.64731    0.0799202  0.877895  0.582062   0.601394 
 0.875966   0.776157   0.664024  0.0996859  0.12747  

julia> allclose(A, A + 1e-4)
false

julia> allclose(A, A + 1e-6)
false

julia> allclose(A, A + 1e-8)
true

julia> allclose(A, A + 1, rtol = 1)
true
Run Code Online (Sandbox Code Playgroud)