Julia 朱莉娅:将CHOLMOD因子转换为稀疏矩阵,然后再转换回来

Julia 朱莉娅:将CHOLMOD因子转换为稀疏矩阵,然后再转换回来,julia,sparse-matrix,matrix-factorization,suitesparse,Julia,Sparse Matrix,Matrix Factorization,Suitesparse,我有一个稀疏矩阵的CHOLMOD分解H,我想编辑上、下和块对角因子的稀疏表示。我该怎么做?当我运行下面的命令时,最后一行不起作用 H = sprand(10,10,0.5) fac = ldltfact(H; shift=0.0) fD = fac[:D] D = Base.SparseArrays.CHOLMOD.Sparse(fD) 是否有任何方法可以从稀疏矩阵向CHOLMOD.factor的相反方向发展?提取ldltfact的相关因子分解矩阵可能有点繁琐。以下示例显示了一个与问题中的示例

我有一个稀疏矩阵的CHOLMOD分解
H
,我想编辑上、下和块对角因子的稀疏表示。我该怎么做?当我运行下面的命令时,最后一行不起作用

H = sprand(10,10,0.5)
fac = ldltfact(H; shift=0.0)
fD = fac[:D]
D = Base.SparseArrays.CHOLMOD.Sparse(fD)

是否有任何方法可以从稀疏矩阵向
CHOLMOD.factor
的相反方向发展?

提取
ldltfact
的相关因子分解矩阵可能有点繁琐。以下示例显示了一个与问题中的示例类似的示例,最后测试提取的矩阵恢复原始分解矩阵:

srand(1)
pre = sprand(10,10,0.5)
H = pre + pre' + speye(10,10)

fac = ldltfact(H; shift=0.0)
P = sparse(1:size(H,1),fac[:p],ones(size(H,1)))
LD = sparse(fac[:LD]) # this matrix contains both D and L embedded in it

L = copy(LD)
for i=1:size(L,1)
  L[i,i] = 1.0
end

D = sparse(1:size(L,1),1:size(L,1),diag(LD))

PHP = P*H*P'
LDL = L*D*L'

using Base.Test
@test PHP ≈ LDL
预期输出(和v0.6.3中的实际输出):


希望这有帮助。

谢谢,这很有帮助!有没有办法从
LD
中以稀疏形式提取块对角因子
D
?因为我需要对0和负特征值进行正定修改,我不想通过对整个对角线进行修改来改变整个矩阵。假设我编辑了
LD
的稀疏表示。有没有什么好办法把它转换回一个
CHOLMOD.factor
?(每次编辑)@jj认为将编辑的
LD
转换为CHOLMOD.factor并不容易,因为函数基本上是围绕CHOLMOD库接口的包装。但是有了因式分解,线性代数应该更快,而不必重新使用CHOLMOD。快速
求解
也为三角矩阵定义。
julia> @test PHP ≈ LDL
Test Passed