在 Julia 1.0.5 中结合 ForwardDiff 和 PyPlot 的问题
Problem with combining ForwardDiff and PyPlot in Julia 1.0.5
在 Julia 1.0.5 中,我有一个函数 f(x::Vector{<:Real})
,定义为
f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2
签名是这样的,因为我想将它与 ForwardDiff
包一起使用,并且它可以正常工作。我将函数赋予 ForwardDiff.gradient
,一切都很顺利。
不过,我也想用 PyPlot
做一些可视化,使用相同的函数 f
。也就是说,我想用 contourf
绘制它的轮廓。为此,我构建了两个向量 X::Vector{<:Real}
和 Y::Vector{<:Real}
,并想用它们调用相同的函数 f
来生成轮廓。
但是,调用 f.([X, Y])
并没有像我希望的那样广播向量,因为我得到了错误
LoadError: MethodError: no method matching (::getfield(Main, Symbol("#f#1044")))(::Int64)
Closest candidates are:
f(!Matched::Array{#s25,1} where #s25<:Real)
这当然会阻止我使用 contourf
函数,因为它需要 2D 网格上的 f
值。
我是否需要定义一个完全不同的 f(x::Vector{<:Real}, y::Vector{<:Real})
才能按照我的意愿绘制等高线,或者是否有替代方法可以避免这种情况?
这个问题可以通过多重分派的力量来解决:
f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2
f(x::Real,y::Real) = f([x,y])
nx = 10
ny = 20
X = rand(nx) #mesh of x points
Y = rand(ny) #mesh of y points
Z = f.(transpose(X),Y) #nx x ny matrix
对于两个参数梯度:
two_point_gradient(f,x,y) = ForwardDiff.gradient(f,[x,y])
G = two_point_gradient.(f,transpose(X),Y) #returns a vector of gradients, where G[i..] = gradient(f,X[i..],Y[i...])
在 Julia 1.0.5 中,我有一个函数 f(x::Vector{<:Real})
,定义为
f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2
签名是这样的,因为我想将它与 ForwardDiff
包一起使用,并且它可以正常工作。我将函数赋予 ForwardDiff.gradient
,一切都很顺利。
不过,我也想用 PyPlot
做一些可视化,使用相同的函数 f
。也就是说,我想用 contourf
绘制它的轮廓。为此,我构建了两个向量 X::Vector{<:Real}
和 Y::Vector{<:Real}
,并想用它们调用相同的函数 f
来生成轮廓。
但是,调用 f.([X, Y])
并没有像我希望的那样广播向量,因为我得到了错误
LoadError: MethodError: no method matching (::getfield(Main, Symbol("#f#1044")))(::Int64)
Closest candidates are:
f(!Matched::Array{#s25,1} where #s25<:Real)
这当然会阻止我使用 contourf
函数,因为它需要 2D 网格上的 f
值。
我是否需要定义一个完全不同的 f(x::Vector{<:Real}, y::Vector{<:Real})
才能按照我的意愿绘制等高线,或者是否有替代方法可以避免这种情况?
这个问题可以通过多重分派的力量来解决:
f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2
f(x::Real,y::Real) = f([x,y])
nx = 10
ny = 20
X = rand(nx) #mesh of x points
Y = rand(ny) #mesh of y points
Z = f.(transpose(X),Y) #nx x ny matrix
对于两个参数梯度:
two_point_gradient(f,x,y) = ForwardDiff.gradient(f,[x,y])
G = two_point_gradient.(f,transpose(X),Y) #returns a vector of gradients, where G[i..] = gradient(f,X[i..],Y[i...])