2016-09-24 3 views
0

Я пытаюсь использовать функцию BLAS dtrmv для умножения вектора треугольной матрицы. Согласно документации:Julia triangular matrix vector BLAS wrapper BLAS.trmv

trmv (ул, Tā, дА, А, б) Возвращает оп (A) * B, где оп определяется TA (N идентичности, T для транспонированной A, и C для сопряженного транспонирования A). Используется только треугольник ul (U для верхнего, L для нижнего). dA указывает, является ли A единично-треугольным (диагональ считается все единичной, если U или неединичной, если 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 как вычислено Mchol = Чхоль (M)»! не работает, но MChol вычисляется LAPACK.potrf ('L', Mchol) работы

ответ

2

Вы можете использовать Mchol=chol(M)' но сначала вам нужно извлечь буфер, то есть BLAS.trmv('L','N','N',Mchol.data,Z). Однако я бы рекомендовал, чтобы вы не вызывали напрямую trmv. Чаще всего вы должны использовать семейство функций Ax_mul_Bx!. В этом случае наиболее эффективным, вероятно, будет вычислять

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

Это будет вызывать BLAS.trmv когда элементы являются одним из четырех типов элементов BLAS, но в отличие от BLAS.trmv он все равно будет работать, например, BigFloat элементы.

Смежные вопросы