Оцените 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.7071
cholupdate
работает только на полные матрицы.
cholupdate
использует алгоритмы от стандартных подпрограмм LINPACK ZCHUD
и ZCHDD
. cholupdate
полезен начиная с вычисления нового Фактора Холесского, с нуля алгоритм, просто обновление существующего фактора таким образом является алгоритм.
[1] Dongarra, набор J.J., J.R., C.B. Moler, и Стюарт G.W., руководство пользователей LINPACK, SIAM, Филадельфия, 1979.