2016-09-24 3 views
0

삼각 행렬 벡터 곱셈에 BLAS 함수 dtrmv를 사용하려고합니다. 따라 문서!줄리아 삼각 행렬 벡터 BLAS 래퍼 BLAS.trmv

trmv (UL이 따 (DA), A는, b), OP (A) * OP는 전치 A에서의 tA (ID의 N, T에 의해 결정되는 (B)을 반환 및 C는 공액 전치 A). 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} 

오류를 해석하는 데 문제가 있습니다. 누구든지 도와 줄 수 있습니까?

편집이 :

작동 Mchol = CHOL (M)에 의해 산출 된 Mchol 해결 '! 작동하지 않습니다 하지만 MChol가 LAPACK.potrf에 의해 계산 ('L ', Mchol)

답변

2

당신은 Mchol=chol(M)'을 사용할 수 있습니다 하지만 먼저 버퍼를 추출해야합니다. 즉, BLAS.trmv('L','N','N',Mchol.data,Z)입니다. 그러나 trmv으로 직접 전화하지 않는 것이 좋습니다. 대부분의 경우 Ax_mul_Bx! 패밀리를 사용해야합니다. 이 경우, 가장 효율적인 아마 요소가 네 BLAS 요소 유형 중 하나이지만 BLAS.trmv 달리 여전히 예를 들면 위해 작동 할 때 BLAS.trmv를 호출합니다

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

이를 계산하는 것 BigFloat 요소