Julia三角矩阵矢量BLAS包装BLAS.trmv

时间:2016-09-24 18:42:36

标签: julia blas

我正在尝试将BLAS函数dtrmv用于三角矩阵向量乘法。根据文件:

  

trmv!(ul,tA,dA,A,b)   返回op(A)* b,其中op由tA确定(N表示同一性,T表示转置A,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由计算 Mchol = CHOL(M)&#39; 不起作用,但MChol计算 LAPACK.potrf!(&#39; L&#39;,Mchol) 作品

1 个答案:

答案 0 :(得分:2)

您可以使用enemyDamage(...),但您必须先提取缓冲区,即Mchol=chol(M)'。但是,我建议您不要直接致电BLAS.trmv('L','N','N',Mchol.data,Z)。大多数情况下,您应该使用trmv系列函数。在这种情况下,最有效的可能是计算

Ax_mul_Bx!

当元素是四种BLAS元素类型之一时,这将调用Mchol = chol(M) Ac_mul_B!(Mchol,Z) ,但与BLAS.trmv相反,它仍将适用于例如BLAS.trmv BigFloat元素。