Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia自动微分-它完全崩溃了吗?_Julia - Fatal编程技术网

Julia自动微分-它完全崩溃了吗?

Julia自动微分-它完全崩溃了吗?,julia,Julia,Julia的ForwardDiff能处理闭包吗?如果不是的话,它就不是很有用了,但是如果是的话,我在下面哪里出错了 using ForwardDiff function make_add(x) foo = y::Vector -> y+x return foo end zulu = make_add(17) g = x-> ForwardDiff.gradient(zulu, x) g([1, 2, 3]) MethodError: no method match

Julia的ForwardDiff能处理闭包吗?如果不是的话,它就不是很有用了,但是如果是的话,我在下面哪里出错了

using ForwardDiff
function make_add(x)
   foo = y::Vector -> y+x
   return foo
end

zulu = make_add(17)

g = x-> ForwardDiff.gradient(zulu, x)

g([1, 2, 3])

MethodError: no method matching extract_gradient! 
  (::Type{ForwardDiff.Tag{##1#2{Int64},Int64}},  
事实上,这与闭包无关。简单地说:

h = x-> ForwardDiff.gradient(x-> x+17.0, x)
炸弹的定义方式与阵列的定义方式完全相同。在标量上使用导数。

ForwardDiff.gadient状态的文档:

此方法假定isafx为实数

问题是函数返回的是向量而不是标量,因此需要使用雅可比矩阵,雅可比矩阵接受数组作为返回值:

julia> function make_add(x)
          foo = y::Vector -> y .+ x
             return foo
             end
make_add (generic function with 1 method)

julia> zulu = make_add(17)
#27 (generic function with 1 method)

julia> g = x-> ForwardDiff.jacobian(zulu, x)
#29 (generic function with 1 method)

julia> g([1, 2, 3])
3×3 Array{Int64,2}:
 1  0  0
 0  1  0
 0  0  1

还请注意,我在+之前添加了一个点,因此它的读数为y.+x,因为在Julia 1.0的当前版本中,不允许在不广播的情况下向向量添加标量。

Ah,所以!在我的版本0.6.4中-我不知道有一个1.0版本+可以正常工作。在0.6.4上,您可以使用。+并且它可以正常工作,在升级到1.0之前,请检查您正在使用的所有软件包是否都已升级-1.0的发布仅在2天前,一些软件包尚未100%同步。
h = x-> ForwardDiff.gradient(x-> x+17.0, x)
julia> function make_add(x)
          foo = y::Vector -> y .+ x
             return foo
             end
make_add (generic function with 1 method)

julia> zulu = make_add(17)
#27 (generic function with 1 method)

julia> g = x-> ForwardDiff.jacobian(zulu, x)
#29 (generic function with 1 method)

julia> g([1, 2, 3])
3×3 Array{Int64,2}:
 1  0  0
 0  1  0
 0  0  1