행렬은 여러 개의 수를 포함하고 있으며, 이를 통해 어떤 시스템이나 변환 등을 표현한다. 또한 우리는 행렬로 표현된 식의 해를 찾거나, 행렬식이나 교유값/벡터 등을 구하여 주어진 시스템이나 변환의 특성을 분석하곤 한다. 하지만 때때로 행렬은 너무 많은 수를 포함하고 있어 위와 같은 계산이 쉽지 않거나, 그 특성이 한 눈에 들어오지 않는 경우가 발생한다. 이러한 문제를 해결하기 위해 우리는 주어진 행렬을 다시 여러 개의 행렬로 분할 할 수 있으며, 분할된 행렬을 통해 여러 계산과 분석을 간소화 할 수 있다. 이 글에서는 행렬 연산에 많이 쓰이는 3가지 행렬 분해 방법을 소개하고자 한다.
LU decomposition은 주어진 m×n 행렬 A를 A=LU 와 같이 m×s 하삼각행렬 L과 s×n 상삼각행렬 U로 분해하는 것이다. 하삼각행렬과 상삼각행렬은 다음과 같으며, 보통 L이나 U 중 하나의 대각 성분은 1로 두기도 한다.
L=⎝⎜⎜⎜⎛■■■■0■■■00■■⎠⎟⎟⎟⎞,U=⎝⎜⎛■00■■0■■■■■■■■■⎠⎟⎞
이제 LU decomposition의 과정을 살펴보자. 먼저 L과 U를 다음과 같이 쓰자.
L=(l1⋯ls),U=⎝⎜⎜⎛u1T⋮usT⎠⎟⎟⎞
우리의 목표는 A=l1u1T+⋯+lsusT=LU의 형태로 만드는 것이다.
먼저 A≡A(1)=(aij(1))로 두며, 여기서 A(1)은 1번째 step에서의 목표 행렬을 의미하며 1번째 step에서 이 목표 행렬은 처음에 주어진 A와 같지만, 이 후 step에서는 달라진다. aij(1)는 A(1)의 각 원소를 의미한다. 이를 이용하여 우리는 l1,u1T를 구할 수 있다.
l1=a11(1)1⎝⎜⎜⎛a11(1)⋮am1(1)⎠⎟⎟⎞,u1T=(a11(1)⋯a1n(1))
위와 같이 설정하면 다음과 같이 쓸 수 있다.
A(1)−l1u1T=⎝⎜⎜⎜⎜⎛00⋮00⋯A(2)0⎠⎟⎟⎟⎟⎞,A(1)=l1u1T+⎝⎜⎜⎜⎜⎛00⋮00⋯A(2)0⎠⎟⎟⎟⎟⎞
이 과정을 A(2)에서도 반복하여 A(3)을 구하며, 2번째 step에서의 l2,u2T는 다음과 같다.
l2=⎝⎜⎜⎜⎛0l(2)⎠⎟⎟⎟⎞,l(2)=a11(2)1⎝⎜⎜⎛a11(2)⋮am′1(2)⎠⎟⎟⎞
u2T=(0,u(2)T),u(2)=(a11(2),⋯,a1n′(2))
이러한 과정을 A(3),⋯,A(s)에 대해서 반복하면 결국 처음 목표했던 A=l1u1T+⋯+lsusT과 같은 형태가 되고, 그 결과를 이용하여 행렬 L,U를 구할 수 있다.
다만, 위 과정에서 a11(1),a11(2)(각 목표 행렬에서 가장 앞에 있는 원소)로 나누는 부분이 있는데 해당 값이 0이라면 문제가 발생한다. 이럴 경우 행렬 A의 행을 서로 치환하여 문제를 해결할 수 있으며, 행의 치환은 다음과 같은 행렬을 곱하는 것으로 볼 수 있다.
P=⎝⎜⎛100001010⎠⎟⎞
위의 예시는 3번째 행과 2번째 행을 서로 바꾸는 것으로 P의 각 행은 하나의 1만 포함하고 있다. 이러한 치환 행렬까지 포함하면 LU decomposition은 다음과 같이 쓸 수 있다.
A=PLUP−1A=PTA=A′=LU
이렇게 행렬을 미리 LU decomposition 해놓으면 이후의 계산에서 많은 이점을 얻을 수 있다. 예를 들어 행렬식 det(A)을 구할때, det(A)=det(LU)=det(L)det(U)이며, 삼각행렬의 행렬식은 삼각행렬의 대각성분의 곱이므로 행렬식을 쉽게 구할 수 있다.
⎝⎜⎛123011001⎠⎟⎞⎝⎜⎛x1x2x3⎠⎟⎞=⎝⎜⎛b1b2b3⎠⎟⎞→⎩⎪⎪⎨⎪⎪⎧x1=b12x1+x2=b2→x2=b2−2b13x1+x2+x3=b3→x3=b3−b1−b2
또한 삼각행렬으로 표현된 방정식은 위와 같이 쉽게 풀 수 있으므로, Ax=b를 풀기 위하여, Ly=b,y=Ux를 먼저 풀고, 이후에 y=Ux를 풀면 간단하게 해결이 가능하다.