2017-03-02 3 views
2

以下のコードでは、関数fgが異なる値を返しています。コードを読むことから、それらが同じように動作することが期待されます。私はそれがv -> innerprodfn(m, v)の閉鎖と関係があると思います。 fgが同じ値を返す場合、どのようにして目的の動作を得るのですか?mapslicesでの関数クロージャ

type Mat{T<:Number} 
    data::Matrix{T} 
end 

innerprodfn{T}(m::Mat{T}, v::Array{T}) = i -> (m.data*v)[i] 
innerprodfn{T}(m::Mat{T}, vv::Matrix{T}) = mapslices(v->innerprodfn(m, v), vv, 1) 

m = Mat(collect(reshape(0:5, 2, 3))) 
v = collect(reshape(0:11, 3, 4)) 
f = innerprodfn(m, v[:,1]) 
g = innerprodfn(m, v)[1] 
m.data * v 
# 10 28 46 64 
# 13 40 67 94 
[f(1) g(1); f(2) g(2)] 
# 10 64 
# 13 94 

答えて

1

私は観察された挙動については説明していませんが、最近の夜間バージョンのJulia oneでは予想される結果が得られます。もちろん

innerprodfn{T}(m::Mat{T}, vv::Matrix{T}) = [innerprodfn(m, vv[:,i]) for i in indices(vv, 2)] 

が、これは同様に0.6で動作します:0.5で

は、この問題を回避するには、理解を使用することです。

関連する問題