크라우트 행렬 분해
Crout matrix decomposition선형대수학에서 크라우트 행렬 분해는 하위 삼각 행렬(L), 상위 삼각 행렬(U), 항상 필요한 것은 아니지만 순열 행렬(P)로 분해하는 LU 분해다.프레스콧 듀랜드 크라우트가 개발했다.[1]
크라우트 행렬 분해 알고리즘은 두리틀 방법과 약간 다르다.두리틀의 방법은 하위 삼각 행렬과 상위 삼각 행렬을, 크라우트 방법은 하위 삼각 행렬과 단위 상위 삼각 행렬을 반환한다.
따라서 행렬 A의 행렬이 분해되는 경우:
- A = LDU
L 단위는 하위 삼각 행렬이고, D 단위는 대각 행렬이고 U 단위는 상위 삼각 행렬이고, 그 다음 두리틀의 방법이 생산된다.
- A = L(DU)
크라우트의 방법이
- A = (LD)U.
구현
C 구현:
공허하게 하다 구김살을 부리다(곱절로 하다 경시하다 **A, 곱절로 하다 **L, 곱절로 하다 **U, 인트로 n) { 인트로 i, j, k; 곱절로 하다 합계를 내다 = 0; 을 위해 (i = 0; i < n; i++) { U[i][i] = 1; } 을 위해 (j = 0; j < n; j++) { 을 위해 (i = j; i < n; i++) { 합계를 내다 = 0; 을 위해 (k = 0; k < j; k++) { 합계를 내다 = 합계를 내다 + L[i][k] * U[k][j]; } L[i][j] = A[i][j] - 합계를 내다; } 을 위해 (i = j; i < n; i++) { 합계를 내다 = 0; 을 위해(k = 0; k < j; k++) { 합계를 내다 = 합계를 내다 + L[j][k] * U[k][i]; } 만일 (L[j][j] == 0) { 활자화하다("디테(L)가 0에 가깝다!\n0으로 나눌 수 없다...\n"); 퇴장하다(EXIT_Failure); } U[j][i] = (A[j][i] - 합계를 내다) / L[j][j]; } } }
옥타브/매트랩 구현:
function [L, U] = LUdecompCrout(A) [R, C] = size(A); for i = 1:R L(i, 1) = A(i, 1); U(i, i) = 1; end for j = 2:R U(1, j) = A(1, j) / L(1, 1); end for i = 2:R for j = 2:i L(i, j) = A(i, j) - L(i, 1:j - 1) * U(1:j - 1, j); end for j = i + 1:R U(i, j) = (A(i, j) - L(i, 1:i - 1) * U(1:i - 1, j)) / L(i, i); end end end
참조
- ^ Press, William H. (2007). Numerical Recipes 3rd Edition: The Art of Scientific Computing. Cambridge University Press. pp. 50–52. ISBN 9780521880688.
- Matlab의 기능을 사용한 구현