이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

cholupdate

촐레스키 분해(Cholesky Factorization)에 대한 랭크 1 업데이트(Rank 1 Update)

구문

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의 촐레스키 분해(Cholesky Factorization)일 때, A + x*x'의 상부 삼각 촐레스키 인수(Cholesky Factor)를 반환합니다. 여기서 x는 적절한 길이의 열 벡터입니다. cholupdateR의 대각 및 상부 삼각만 사용합니다. R의 하부 삼각은 무시됩니다.

R1 = cholupdate(R,x,'+')R1 = cholupdate(R,x)와 동일합니다.

R1 = cholupdate(R,x,'-')A - x*x'의 촐레스키 인수(Cholesky Factor)를 반환합니다. R이 유효한 촐레스키 인수(Cholesky Factor)가 아니거나 다운데이트(Downdate)된 행렬이 양의 정부호가 아니어서 촐레스키 분해(Cholesky Factorization)가 없는 경우 오류 메시지가 보고됩니다.

[R1,p] = cholupdate(R,x,'-')는 오류 메시지를 반환하지 않습니다. p0인 경우 R1A - x*x'의 촐레스키 인수(Cholesky Factor)입니다. p0보다 큰 경우 R1은 원래 A의 촐레스키 인수(Cholesky Factor)입니다. p1이 아닌 경우 다운데이트된 행렬은 양의 정부호가 아니므로 cholupdate가 실패합니다. p2인 경우 R의 상부 삼각이 유효한 촐레스키 인수(Cholesky Factor)가 아니므로 cholupdate가 실패합니다.

예제

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]';

rank(x*x')1이므로 다음을 A에 대한 랭크 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')로 촐레스키 인수(Cholesky Factor)를 계산하는 대신에 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

그런 다음 A의 마지막 요소에서 1을 빼서 양의 정부호 특성을 없애고 실제로 행렬을 특이 행렬로 만듭니다. 다운데이트(Downdate)된 행렬은 다음과 같습니다.

A - x*x'
ans =
 
     1     1     1     1
     1     2     3     4
     1     3     6    10
     1     4    10    19

cholcholupdate와 비교합니다.

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.

그러나 A의 마지막 요소에서 0.5를 빼면 양의 정부호 행렬이 생성되며, cholupdate를 사용하여 촐레스키 인수(Cholesky Factor)를 계산할 수 있습니다.

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는 비희소 행렬(Full Matrix)에만 적용됩니다.

알고리즘

cholupdate는 LINPACK 서브루틴 ZCHUDZCHDD의 알고리즘을 사용합니다. 새 촐레스키 인수를 처음부터 계산하는 것은 O(N3) 알고리즘이고 이런 식으로 기존 인수를 간단히 업데이트하는 것은 O(N2) 알고리즘이므로 cholupdate는 유용합니다.

참고 문헌

[1] Dongarra, J.J., J.R. Bunch, C.B. Moler, and G.W. Stewart, LINPACK Users' Guide, SIAM, Philadelphia, 1979.

확장 기능

참고 항목

|

R2006a 이전에 개발됨