Оцените 1 обновление факторизации Холесского
R1 = cholupdate (R, x)
R1 = cholupdate (R, x', + ')
R1 = cholupdate (R, x, '-')
[R1, p] = cholupdate (R, x, '-')
R1 = cholupdate(R,x), где R = chol(A) является исходная факторизация Холесского A, возвращает верхний треугольный Фактор Холесского A + x*x', где x является вектором - столбцом соответствующей длины. cholupdate использует только диагональный и верхний треугольник R. Более низкий треугольник R проигнорирован.
R1 = cholupdate(R,x,'+') совпадает с R1 = cholupdate(R,x).
R1 = cholupdate(R,x,'-') возвращает Фактор Холесского A - x*x'. Сообщение об ошибке сообщает, когда R не является допустимый Фактор Холесского или когда downdated матрица не положительна определенный и так не имеет факторизации Холесского.
[R1,p] = cholupdate(R,x,'-') не возвратит сообщение об ошибке. Если p является 0, R1 является Фактор Холесского A - x*x'. Если p больше, чем 0, R1 является Фактор Холесского исходного A. Если p является 1, cholupdate, отказавший, потому что downdated матрица не положительна определенный. Если p является 2, cholupdate, отказавший, потому что верхним треугольником R не был допустимый Фактор Холесского.
A = pascal(4)
A =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
R = chol(A)
R =
1 1 1 1
0 1 2 3
0 0 1 3
0 0 0 1
x = [0 0 0 1]';Это называется рангом одним обновлением A, поскольку rank(x*x') является 1:
A + x*x' ans =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 21Вместо того, чтобы вычислить Фактор Холесского с R1 = chol(A + x*x'), мы можем использовать cholupdate:
R1 = cholupdate(R,x) R1 =
1.0000 1.0000 1.0000 1.0000
0 1.0000 2.0000 3.0000
0 0 1.0000 3.0000
0 0 0 1.4142Затем уничтожьте положительную определенность (и на самом деле сделайте матрицу сингулярной) путем вычитания 1 из последнего элемента A. downdated матрица:
A - x*x'
ans =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 19Сравните chol с cholupdate:
R1 = chol(A-x*x') Error using chol Matrix must be positive definite. R1 = cholupdate(R,x,'-') Error using cholupdate Downdated matrix must be positive definite.
Однако вычитание 0.5 от последнего элемента A производит положительную определенную матрицу, и мы можем использовать cholupdate, чтобы вычислить его Фактор Холесского:
x = [0 0 0 1/sqrt(2)]';
R1 = cholupdate(R,x,'-')
R1 =
1.0000 1.0000 1.0000 1.0000
0 1.0000 2.0000 3.0000
0 0 1.0000 3.0000
0 0 0 0.7071cholupdate работает только на полные матрицы.
cholupdate использует алгоритмы от стандартных подпрограмм LINPACK ZCHUD и ZCHDD. cholupdate полезен начиная с вычисления нового Фактора Холесского, с нуля алгоритм, просто обновление существующего фактора таким образом является алгоритм.
[1] Dongarra, набор J.J., J.R., C.B. Moler, и Стюарт G.W., руководство пользователей LINPACK, SIAM, Филадельфия, 1979.