На викиведии (
https://en.wikipedia.org/wiki/Cholesky_decomposition#Updating_the_decomposition) описана чистичная модификация фактора Холецкого при обновлении исходной матрицы. Не могу понять, как модифицировать алгоритм с учетом нормализиции.
Т.е., если есть исходная матрица J (прямоугольная, частных производных), то находим от нее симметричную положительно определенную матрицу как
Код:
H = J'*J;
Затем (с помощью матлаба) находим фактор разложения Холецкого от матрицы H
Код:
L = chol(H)';
Процедура модификации фактора описана в википедии как
Код:
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
Тогда при добавлении строки к матрице J быстро находим модифицированный фактор
Код:
L_updated = cholupdate(L, new_J_row');
Но все меняется, если мне надо провести нормализцию матрицы H. Нормализацию делаю так:
Код:
n = 1 ./ sqrt(diag(H));
Hn = diag(n) * H * diag(n);
Ln = chol(Hn)';
Как выполнить модификацию Lh фактора (добавление не-нормализованной строки к матрице J) с учетом нормализации H?