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

标签 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")
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)

logdet(sparse(A))

我收到错误:

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...

我不确定我的编码方式是否有问题(我是从 matlab 过渡的初学者),或者我的 Julia 安装是否有问题(尽管我已在另一台计算机上复制了这些结果) )。您能给我的任何指示都会很棒!

最佳答案

原因是稀疏 LU 也有一个缩放因子,可以使用 LUFs[:Rs] 提取(在 Julia 0.6 中和 Julia 中的 LUFs.Rs 0.7-)。因此计算变成

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

julia> det(A)
0.4576579970452133 - 0.07585833005688908im

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

关于julia - 在 Julia 中计算稀疏矩阵的对数行列式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47912691/

相关文章:

julia - Julia 中如何锁定变量类型?

julia - 在 Julia 中初始化数组的数组

用于稀疏矩阵的 Fortran 90/95 库?

sse - SIMD 行列式计算

c++ - 通过高斯消元法求矩阵的行列式 C++

julia - 从Julia脚本生成独立的可执行文件?

julia - 如何编写一个函数来检查每个调用方法的返回类型是否可以静态推断?

python - 堆叠两个不同维度的稀疏矩阵

r - 将列名和行名的文本文件转换为稀疏矩阵

c - 通过管道函数在 C 中计算行列式矩阵。修订代码