【问题标题】:Julia: converting CHOLMOD factor to sparse matrix and back againJulia:将 CHOLMOD 因子转换为稀疏矩阵并再次转换回来
【发布时间】:2018-07-07 18:37:23
【问题描述】:

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

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

有没有什么方法可以从稀疏矩阵反向转到CHOLMOD.factor

【问题讨论】:

    标签: julia sparse-matrix matrix-factorization suitesparse


    【解决方案1】:

    提取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
    

    预期输出(和 Julia v0.6.3 上的实际输出):

    julia> @test PHP ≈ LDL
    Test Passed
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这很有帮助!有什么方法可以从LD 中以稀疏形式提取块对角因子D?因为我需要对 0 和负特征值进行正定修改,并且我不想通过对整个对角线修改进行分解来改变整个矩阵。
    • 假设我编辑了LD 的稀疏表示。有什么好方法可以将其转换回CHOLMOD.factor? (每次编辑)
    • @jjjjjj 不要认为将编辑后的LD 转换为 CHOLMOD.factor 很容易,因为这些函数基本上是 CHOLMOD 库接口的包装器。但是有了可用的因式分解,线性代数应该更快,而无需重新使用 CHOLMOD。快速solve 也适用于三角矩阵。
    猜你喜欢
    • 2023-04-10
    • 2021-11-25
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多