Julia中稀疏矩阵对数行列式的计算

Julia中稀疏矩阵对数行列式的计算,julia,sparse-matrix,determinants,matrix-factorization,Julia,Sparse Matrix,Determinants,Matrix Factorization,我对计算大型稀疏复杂(浮点)矩阵行列式的对数感兴趣。我的第一个想法是使用LU分解,即: srand(123) A=complex.(rand(3,3), rand(3,3)) LUF=lufact(A) LUFs=lufact(sparse(A)) if round(det(LUFs[:L])*det(LUFs[:U])-det(A[LUFs[:p], LUFs[:q]]), 5)==0 println("Sparse LU determinant is correct\n") e

我对计算大型稀疏复杂(浮点)矩阵行列式的对数感兴趣。我的第一个想法是使用LU分解,即:

srand(123) 
A=complex.(rand(3,3), rand(3,3))

LUF=lufact(A)
LUFs=lufact(sparse(A))

if round(det(LUFs[:L])*det(LUFs[:U])-det(A[LUFs[:p], LUFs[:q]]), 5)==0
    println("Sparse LU determinant is correct\n")
else
    println("Sparse LU determinant is NOT correct\n")
end
将始终打印出“不正确”选项。此外,

round.(LUFs[:L]*LUFs[:U], 5)==round.(A[LUFs[:p], LUFs[:q]], 5)
结果总是假的

如果我尝试直接使用

logdet(LUFs)

我得到一个错误:

LoadError: MethodError: no method matching
logabsdet(::Base.SparseArrays.UMFPACK.UmfpackLU{Complex{Float64},Int64})
Closest candidates are:
logabsdet(!Matched::Base.LinAlg.UnitUpperTriangular{T,S} where S<:
(AbstractArray{T,2} where T)) where T at linalg/triangular.jl:2184
logabsdet(!Matched::Base.LinAlg.UnitLowerTriangular{T,S} where S<:
(AbstractArray{T,2} where T)) where T at linalg/triangular.jl:2185
logabsdet(!Matched::Union{LowerTriangular{T,S} where S<:
(AbstractArray{T,2} where T), UpperTriangular{T,S} where S<:
(AbstractArray{T,2} where T)}) where T at linalg/triangular.jl:2189
...
while loading...
LoadError:MethodError:没有方法匹配
logabsdet(::Base.sparsearray.UMFPACK.UmfpackLU{Complex{Float64},Int64})
最接近的候选人是:

logabsdet(!Matched::Base.LinAlg.UnitUpperTriangular{T,S}其中S原因是稀疏LU也有一个比例因子,可以使用
LUFs[:Rs]
(在Julia 0.6和
LUFs.Rs
在Julia 0.7-)提取。因此,计算变得非常复杂

julia> det(LUFs[:U])/prod(LUFs[:Rs])
0.4576579970452131 - 0.07585833005688908im

julia> det(A)
0.4576579970452133 - 0.07585833005688908im

对于稀疏情况,我们可能也应该有
logabsdet
。但是,你的矩阵是正定的吗?这样,你就可以计算Cholesky分解的
logdet

有多接近?可能只是浮点舍入错误。你几乎不应该使用
=
来比较r浮点计算的结果,特别是经过多线程BLAS的结果。这对于任何语言的编程都是正确的。仅凭这些数字的工作方式,就会有一些舍入误差。这是一个非常好的点,但它偏离了一个数量级。对于上面的rng种子,我得到det(LUFs[:L])*det(LUFs[:U])=0.0216…-0.00358…im和det(A)=0.458…-0.0759…im。(编辑以解决这一点)速度有多重要?使用SVD分解并执行类似于
log(complex(det(U))+sum(log.(d))+logdet(complex)(det(T))
的操作。不幸的是,我的矩阵不是正定的,但添加比例因子解决了我的问题。谢谢!
julia> det(LUFs[:U])/prod(LUFs[:Rs])
0.4576579970452131 - 0.07585833005688908im

julia> det(A)
0.4576579970452133 - 0.07585833005688908im