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

时间:2014-11-24 06:11:24

标签: numpy julia

在numpy中,您可以np.allclose(A, B)查看数组A& B很接近。

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

3 个答案:

答案 0 :(得分:11)

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

Julia 0.4中isapprox的数组版本为introduced,所以您现在可以写:

isapprox(A, B)

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

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

顺便说一下,如链接拉取请求中所述,在测试中,您可以编写@test isapprox(A, B),因此@test_approx_eq现已过时且deprecated as of 0.6。此外,还有A ≈ B,相当于isapprox(A, B),可以像任何比较运算符一样使用:a < b ≈ c ≤ d


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

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

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

答案 1 :(得分:6)

Julia附带了一个名为allclose的功能:

julia> allclose
ERROR: allclose not defined

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

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

在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

答案 2 :(得分:3)

如果您正在编写测试,则using Base.Test然后@test_approx_eq A B应该有效。