크라우트 행렬 분해

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

참조

  1. ^ Press, William H. (2007). Numerical Recipes 3rd Edition: The Art of Scientific Computing. Cambridge University Press. pp. 50–52. ISBN 9780521880688.