Julia中稀疏矩阵对数行列式的计算
我对计算大型稀疏复杂(浮点)矩阵行列式的对数感兴趣。我的第一个想法是使用LU分解,即: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
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