在Julia 1.0.5中合并ForwardDiff和PyPlot的问题

问题描述 投票:1回答:1

在Julia 1.0.5中,我有一个函数f(x::Vector{<:Real}),定义为

f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2

签名是这样的,因为我想将其与ForwardDiff包一起使用,并且可以正常使用。我将功能赋予ForwardDiff.gradient,一切工作都像个魅力。

但是,我也想使用相同的功能PyPlotf进行一些可视化。即,我想用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})以便能够按我的意愿绘制轮廓,或者有替代方法可以避免这种情况?

function matplotlib parameters julia numpy-broadcasting
1个回答
0
投票

此问题可以通过多次调度的力量来解决:

f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2
f(x::Real,y::Real) = f([x,y])
X = rand(10)
Y = rand(10)
f.(X,Y)

对于两个参数渐变:

two_point_gradient(f,x,y) = ForwardDiff.gradient(f,[x,y])
G = two_point_gradient.(f,X,Y) #returns a vector of gradients, where G[i] = gradient(f,X[i],Y[i])
© www.soinside.com 2019 - 2024. All rights reserved.