我正在尝试将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) 作品
答案 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
元素。