由于 UDU 等级 1 更新很难找到,下面是一个 MATLAB 实现(没有任何形式的保证)
降期
function [Ubar, Dbar] = ThorntonRank1Downdate(U, D, c, a)
Ubar = U;
Dbar = D;
n = length(a);
for j = n : -1 : 2
s = a(j);
d = D(j) - c * s^2;
b = c / d;
beta = s * b;
c = b * D(j);
Dbar(j) = d;
a( 1:(j-1) ) = a( 1:(j-1) ) - s * U( 1:(j-1) ,j);
Ubar( 1:(j-1) ,j) = U( 1:(j-1) ,j) - beta * a( 1:(j-1) ) ;
end
Dbar(1) = D(1) - c * a(1)^2;
更新
function [Ubar, Dbar] = ThorntonRank1Update(U, D, c, a)
Ubar = U;
Dbar = D;
n = length(a);
for j = n : -1 : 2
s = a(j);
d = D(j) + c * s^2;
b = c / d;
beta = s * b;
c = b * D(j);
Dbar(j) = d;
for i = j-1 : -1 : 1
a(i) = a(i) - s * U(i,j);
Ubar(i,j) = U(i,j) + beta * a(i);
end
end
Dbar(1) = D(1) + c * a(1)^2;
测试程序
% Requires symbolic toolbox
syms u12 u13 u14 u23 u24 u34 real
U = [1 u12 u13 u14; 0 1 u23 u24; 0 0 1 u24; 0 0 0 1]
% U = [1 u12 u13; 0 1 u23; 0 0 1]
syms v1 v2 v3 v4 real
v = [v1;v2;v3; v4]
% v = [v1;v2;v3]
syms d1 d2 d3 d4 real
D = diag([d1,d2,d3,d4]);
% D = diag([d1, d2, d3]);
syms c positive
%--------------------------------------------------------------------------
P = U * D * U.' + c * (v * v.');
[Udash, Ddash] = UD(P)
[Ubar, Dbar] = ThorntonRank1Update(U, diag(D), c, v)
update_TestU = simplify(Udash - Ubar, 'seconds', 10)
update_TestD = simplify(Ddash - diag(Dbar), 'seconds', 10)
update_TestPbar = simplify((Ubar * diag(Dbar) * Ubar.') - P, 'seconds', 10)
update_TestPdash = simplify((Udash * Ddash * Udash.') - P, 'seconds', 10)
%--------------------------------------------------------------------------
P = U * D * U.' - c * (v * v.');
[Udash, Ddash] = UD(P)
[Ubar, Dbar] = ThorntonRank1Downdate(U, diag(D), c, v)
downdate_TestU = simplify(Udash - Ubar, 'seconds', 10)
downdate_TestD = simplify(Ddash - diag(Dbar), 'seconds', 10)
downdate_TestPbar = simplify((Ubar * diag(Dbar) * Ubar.') - P, 'seconds', 10)
downdate_TestPdash = simplify((Udash * Ddash * Udash.') - P, 'seconds', 10)
%--------------------------------------------------------------------------
参考
第 55 页:Bierman, GJ,“离散序列估计的因式分解方法”,学术出版社,1977 年
以下论文也很有用:
Fletcher, R. & Powell, MJD On the modify of LDLT factorisations of Computation, 1974, 28, 1067-1087 ( PDF )
复杂
如果没有进行适当的 FLOPS 计数,它看起来应该是n2+O(n).