2016-09-24 14 views
0

三角行列ベクトル乗算にBLAS関数dtrmvを使用しようとしています。ドキュメントによると:!Julia三角行列ベクトルBLASラッパーBLAS.trmv

trmv(ULは、TaやDA、Aは、B)、OP(A)* opが転置AのためのTA(アイデンティティのためのN、Tによって決定されたBを、返し と共役転置AについてはC)。 Aのul三角形(上のU、下のL)のみが使用されます。 dAは、Aが単位三角形であるかどうかを示します(対角はUの場合はすべて1、Nの場合は非単位とみなされます)。乗算はb上でインプレースで行われます。

私はこれを使用して、実際にトラブルを抱えています。ここに私の例があります:

julia> BLAS.trmv('L','N','N',Mchol,Z) 
ERROR: MethodError: `trmv` has no method matching trmv(::Char, ::Char, ::Char, ::LowerTriangular{Float64,Array{Float64,2}}, ::Array{Float64,1}) 
Closest candidates are: 
    trmv(::Char, ::Char, ::Char, ::Union{DenseArray{Float64,2},SubArray{Float64,2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, ::Union{DenseArray{Float64,1},SubArray{Float64,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}) 
    trmv(::Char, ::Char, ::Char, ::Union{DenseArray{Float32,2},SubArray{Float32,2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, ::Union{DenseArray{Float32,1},SubArray{Float32,1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}) 
    trmv(::Char, ::Char, ::Char, ::Union{DenseArray{Complex{Float64},2},SubArray{Complex{Float64},2,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}, ::Union{DenseArray{Complex{Float64},1},SubArray{Complex{Float64},1,A<:DenseArray{T,N},I<:Tuple{Vararg{Union{Colon,Int64,Range{Int64}}}},LD}}) 
    ... 

julia> typeof(Mchol) 
LowerTriangular{Float64,Array{Float64,2}} 

julia> typeof(Z) 
Array{Float64,1} 

エラーの解釈に問題があります。誰も助けることができますか?

EDIT:あなたはMchol=chol(M)'を使用することができます Mchol = CHOL(M)によって計算され Mcholを解決し」 は動作しませんが、MCholが LAPACK.potrfによって計算された!( 'L'、Mchol)

答えて

2

の作品 バッファーを最初に抽出する必要があります。つまり、BLAS.trmv('L','N','N',Mchol.data,Z)です。しかし、trmvに直接電話することはお勧めしません。ほとんどの場合、Ax_mul_Bx!ファミリの関数を使用する必要があります。この場合、最も効率的ではおそらく要素が4つのBLAS要素の種類の一つですが、BLAS.trmvとは対照的に、それはまだ、例えばのために働くときBLAS.trmvを呼び出します

Mchol = chol(M) 
Ac_mul_B!(Mchol,Z) 

これを計算することであろうBigFloat要素。

関連する問題