cholupdate

Оцените 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 полезен начиная с вычисления нового Фактора Холесского, с нуля O (N3) алгоритм, просто обновление существующего фактора таким образом является O (N2) алгоритм.

Ссылки

[1] Dongarra, набор J.J., J.R., C.B. Moler, и Стюарт G.W., руководство пользователей LINPACK, SIAM, Филадельфия, 1979.

Расширенные возможности

Смотрите также

|

Представлено до R2006a

Была ли эта тема полезной?