对julia中的匿名函数感到困惑



我有这样的代码:

Using ForwardDiff:gradient
derivative(f,x) = gradient(x->f(x[1]),[x])

我知道ForwardDiff中的梯度以向量为参数,但这意味着什么:(x->f(x[1])),我对x[1]感到困惑。

我被x[1]弄糊涂了

表示取向量x的第一个元素

如果最后一个参数是[x],这段代码就没有多大意义了。你应该直接用

julia> ForwardDiff.derivative(sin, 1.0)
0.5403023058681398

我是在回答你的问题的标题,而不是具体的ForwardDiffAPI。

匿名函数允许您"动态地"定义函数,而不需要它们存在于定义它们的作用域之外。它们通常用于其他函数请求一个函数作为参数的上下文中。当我需要使用一个定义了许多参数的函数,但我只想考虑一个参数时,我个人经常使用它们。

以以下函数为例:

foo(x,y) = x+y

并且假设您只想迭代它的第一个参数。您可以使用map函数,它的第一个参数确实是一个函数:

map(x->foo(x,10),[1,2,3])

调用函数foo,第一个参数是1,然后是2,最后是3,第二个参数是10

这相当于定义一个新的函数foo2(x) = foo(x,10)并在其上广播:

foo2.([1,2,3])

当然,在这个简单的例子中,您可以只使用默认参数或直接广播第一个参数foo.([1,2,3],10),但有时这是不可能的,或者你无法控制函数定义来修复默认参数,因此匿名函数变得很方便。

使用匿名函数的另一种情况是,当你在开发一个库时,一个函数需要一个函数作为参数,而你想提供一个默认值,而不需要显式地定义另一个函数。对于一个实际案例,在BetaML机器学习工具包中,我将随机梯度下降构造函数定义为:

function SGD(;η=t -> 1/(1+t), λ=2) = ...

η所在时代的学习速率的函数。

我可以定义一个新的函数learningRateAdjustmentDefault(t) = 1/(1+t),并将η=learningRateAdjustmentDefault放在SGD参数定义中,在这些情况下使用匿名函数更方便和透明…

最新更新