关于Julia中ForwardDiff所用匿名函数x->f(x[1])的疑问
代码逻辑解答
这段代码的作用是对ForwardDiff.gradient做适配封装,让原本只能处理多变量向量输入的梯度计算接口,能用来计算单变量标量函数的导数。
匿名函数 x->f(x[1]) 的含义
这是Julia的匿名函数语法,等价于如下的具名函数:
function wrap_f(vec_input) # 取出输入向量的第一个元素传给原单变量函数f return f(vec_input[1]) end
这里的参数x(也就是上面示例的vec_input)是gradient函数接收的输入向量,对应你代码里传入的[x]——因为gradient要求输入必须是向量,所以你把原本的单变量标量参数先包装成了只有1个元素的一维向量。
x[1] 的作用
因为你要计算导数的原函数f是单变量函数,只能接收标量输入,所以需要用x[1]把gradient传入的一维向量里唯一的元素取出来,再传给f做计算。
举个实际调用的例子会更清晰:
假设你要计算f(x) = 2x²在x=4处的导数,调用你写的derivative(f, 4)时,执行逻辑如下:
- 把标量
4包装成一维向量[4]传给gradient gradient把[4]传入匿名函数,匿名函数用x[1]取出4传给f,计算得到f(4)=32gradient计算得到梯度值为[16],刚好对应单变量函数在x=4处的导数结果
补充说明:ForwardDiff官方已经提供了直接计算单变量导数的接口
ForwardDiff.derivative,你这段代码其实就是手动实现了这个官方接口的基础逻辑。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

