2016-07-12 1 views
3

JuliaのForwardDiffパッケージを正しく使用する上で問題があります。私はコードの次のチャンクで私の問題を分離することができた。要するにJuliaのForwardDiffとの自動判別

、私は関数を定義:

using ForwardDiff 

function likelihood(mu,X) 

    N = size(X,2) 

    # Calculate likelihood 
    aux = zeros(N) 
    for nn=1:N 
    aux[nn] = exp(-0.5 * (X[:,nn]-mu)' * (X[:,nn]-mu))[1] 
    end 

    # return log-likelihood 
    return sum(log(aux)) 

end 

機能が動作するかどうか、私はその後、チェック:

# Check if function works at all 
X = randn(2,3) # some random data 
mu = [1.0;2.0] # arbitrary mean 
@show likelihood(mu,X) # works fine for me 

私は、使用してグラデーションを取得しよう:

ForwardDiff.gradient(ARG -> likelihood(ARG, X), mu) 

残念ながらこれは失敗し、私の画面に表示されます:

ERROR: MethodError: convert has no method matching convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) This may have arisen from a call to the constructor Float64(...), since type constructors fall back to convert methods. Closest candidates are:
call{T<:AbstractFloat}(::Type{T<:AbstractFloat}, ::Real, ::RoundingMode{T}) call{T}(::Type{T}, ::Any)
convert(::Type{Float64}, ::Int8) ... in likelihood at none:10 in anonymous at none:1

私は間違っていますか?前もって感謝します。

+0

さらなる調査では、私は上記のコードのさらに単純なバージョンでこのエラーを再現することができました。私はForwardDiff githubに問題をオープンしました。私もここでコメントを投稿します。 – user1438310

答えて

3

私は、これは私の側で不注意なミスであることを知らされました。

エラーはゼロへの呼び出しである:

aux = zeros(eltype(mu),N) 

にこれを変更する

aux = zeros(N) 

は、問題を解決します。これが他の人には便利だと思っています。

関連する問題