이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.
촐레스키 분해(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
는 적절한 길이의 열 벡터입니다. cholupdate
는 R
의 대각 및 상부 삼각만 사용합니다. 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,'-')
는 오류 메시지를 반환하지 않습니다. p
가 0
인 경우 R1
은 A - x*x'
의 촐레스키 인수(Cholesky Factor)입니다. p
가 0
보다 큰 경우 R1
은 원래 A
의 촐레스키 인수(Cholesky Factor)입니다. p
가 1
이 아닌 경우 다운데이트된 행렬은 양의 정부호가 아니므로 cholupdate
가 실패합니다. p
가 2
인 경우 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
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.
그러나 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 서브루틴 ZCHUD
및 ZCHDD
의 알고리즘을 사용합니다. 새 촐레스키 인수를 처음부터 계산하는 것은 알고리즘이고 이런 식으로 기존 인수를 간단히 업데이트하는 것은 알고리즘이므로 cholupdate
는 유용합니다.
[1] Dongarra, J.J., J.R. Bunch, C.B. Moler, and G.W. Stewart, LINPACK Users' Guide, SIAM, Philadelphia, 1979.