使用LDL分解更新cholrank1

时间:2015-09-14 13:17:00

标签: matlab matrix linear-algebra

对于对称正定(SPD)矩阵,我有cholrank1更新程序(wikipedia)。

function [L] = cholupdate(L,x)
    p = length(x);
    for k=1:p
        r = sqrt(L(k,k)^2 + x(k)^2);
        c = r / L(k, k);
        s = x(k) / L(k, k);
        L(k, k) = r;
        L(k+1:p,k) = (L(k+1:p,k) + s*x(k+1:p)) / c;
        x(k+1:p) = c*x(k+1:p) - s*L(k+1:p,k);
    end
end

适用于LL分解。我尝试修复过程以使用LDL分解(即不调用sqrt),如下所示:

function [L] = cholupdate_ldl(L,x)
    p = length(x);
    for k=1:p
        r = L(k,k) + x(k)^2;
        c = r / L(k, k);
        s = x(k) / L(k, k);
        L(k, k) = r;
        L(k+1:p,k) = (L(k+1:p,k) + s*x(k+1:p)) / c;
        x(k+1:p) = sqrt(c)*(x(k+1:p) - x(k)*L(k+1:p,k));
    end
end

它工作正常,但我被迫使用sqrt。如何在不使用sqrt的情况下更新LDL分解?

1 个答案:

答案 0 :(得分:3)

有很多方法。在计算数学中查看 Gill,Golub,Murray和Saunders(1974)Methods for Modifying Matrix Factorizations。为了正式总结你的问题,我引用了论文:

enter image description here

enter image description here

最后我们进入算法:

enter image description here

这是我在MATLAB中的实现:

$data   = [
    key1 => 'value1',
    key2 => 'value2',
    key3 => 'value3',
    key4 => 'value4',
    table2.key1 => 'value1',
    table2.key2 => 'value2',
    table2.key3 => 'value3',
]

上面引用的论文和 Gill,Murray和Wright(1982)Practical Optimization中有一种替代算法。 Brian Borchers有一套完整的MATLAB代码,用于处理 Golub和Van Loan(2013) Matrix Computations 和{{3}中定义的实对称正定LDLT因子分解}}。