我有這個代碼:
Using ForwardDiff:gradient
derivative(f,x) = gradient(x->f(x[1]),[x])
我知道 ForwardDiff 中的梯度將向量作為引數,但這意味著什么:(x->f(x[1])),我對x[1].
uj5u.com熱心網友回復:
我很困惑
x[1]
意思是取向量的第一個元素x。
這段代碼[x]作為最后一個引數并沒有多大意義。您可能應該只使用例如:
julia> ForwardDiff.derivative(sin, 1.0)
0.5403023058681398
uj5u.com熱心網友回復:
我回答的是您問題中的標題,而不是特定的ForwardDiffAPI。
匿名函式允許您“即時”定義函式,而不會將它們存在于定義它們的范圍之外。當其他函式要求函式作為引數時,它們通常用于背景關系中。當我需要使用定義有許多引數的函式但我只想考慮一個時,我個人經常使用它們。
以下面的函式為例:
foo(x,y) = x y
并假設您只想迭代它的第一個引數。您可以使用map第一個引數確實是函式的函式:
map(x->foo(x,10),[1,2,3])
this 呼叫函式foo,第一個引數為 as 1, then2和 finally 3,保留10為第二個引數。
這相當于定義一個新函式foo2(x) = foo(x,10)并對其進行廣播:
foo2.([1,2,3])
當然,在這個簡單的例子中,您可以只使用默認引數或直接廣播第一個引數,
foo.([1,2,3],10)但有時這是不可能的,或者您無法控制函式定義來修復默認引數,因此匿名函式可以變得方便。
當您想要使用匿名函式時,另一個背景關系是當您正在開發一個庫并且一個函式需要一個函式作為引數并且您想提供默認值而不明確定義另一個函式時。對于一個真實的案例,在BetaML 機器學習工具包中,我將隨機梯度下降建構式定義為:
function SGD(;η=t -> 1/(1 t), λ=2) = ...
哪里η是作為 epoch 函式的學習率。
我可以定義一個新函式learningRateAdjustmentDefault(t) = 1/(1 t)并放入η=learningRateAdjustmentDefaultSGD 引數定義中,在這些情況下僅使用匿名函式更方便和透明...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311549.html
