지난 포스팅의 마지막 부분에 우리는 치환행렬(Permutation matrix)과 전치(Transpose)에 대해 간략히 언급하였다. 이번 포스팅의 서두에선 이에 대해 좀 더 이야기해보고 마무리 짓도록 하자. 



1. Permutations


이전 포스팅에서 언급했듯이 치환 행렬(Permutation matrix)은 행 교환(row exchange)을 수행하는 행렬이다. 그렇다면 이러한 치환 행렬은 언제 필요할까? 우리는 지금까지 행렬의 소거를 하는 과정에서 행 교환이 필요없는 경우를 가정하고 소거를 진행하였다. 하지만 항상 완벽한 행렬만 존재할 수는 없기 때문에 반드시 행 교환이 필요할 때가 있다. 바로 pivot이 0인 경우다. 소거 과정에서 pivot이 0이 되는 경우에 행 교환이 필요하며 이때 사용되는 행렬이 바로 치환 행렬이다. 이러한 치환은 한 번이 될 수도, 혹은 여러 번이 필요할 수도 있다. 그때 마다 필요한 치환 행렬을 곱해서 행 교환을 해서 소거를 완료하는 것이다. 



A=LU Decomposition을 살펴보자. 우선 A=LU의 형태는 아래와 같을 것이다. 지금까지 가졌던 가정은 A는 행 교환이 필요 없는 완벽한 행렬이라는 것이다. 따라서 P행렬도 필요 없었고, 여기서의 P행렬은 단위행렬이 될 것이다. 행 교환이 필요 없기 때문에 단위 행렬을 곱해서 행을 그대로 둔 채 소거를 해 나간다.



여기서 잠깐 실질적인 이야기를 해보자. 그렇다면 실제로 MATLAB과 같은 프로그램에서 이러한 소거 연산을 어떻게 수행할까? MATLAB에선 소거 연산을 수행할 때 우리가 체크하는 것과 같이 pivot이 0인지를 체크한다. 그런데 MATLAB은 여기서 한 가지 더 체크를 하는 것이 있다. 바로 pivot의 값이 충분히 큰지를 검한다. 만약 pivot값이 0에 가깝다면 수치적으로(numerically) 좋지 않다. 대수적으론 이러한 과정이 필요하지 않지만, 수치 정확도(numerical accuracy)가 좋지 않아서 계산 결과가 좋지 않을 수 있다. 따라서 0에 가까운 pivot이 있을 경우 MATLAB은 행 교환 연산을 수행한다.


어쨋든 A=LU Decomposition을 할 때 행 교환이 필요한 경우 식이 아래와 같이 된다. 



여기서 P는 행 교환 연산을 수행하는 치환행렬이고, 위 식은 어떤 invertible A에도 적용이 된다. 사실 대부분의 경우 행 교환이 필요하지 않는데, 가끔씩 행 교환이 필요한 경우 위와 같이 P행렬을 통해 행 교환 및 소거를 수행한다. 

지난 포스팅(lecture 4)에서 언급했듯이 P행렬은 단위행렬에서 각 행을 서로 교환한 조합이다. 이를 다시 한 번 상기시키자면 아래 식과 같다. 



단위 행렬도 하나의 치환 행렬에 포함되며 P12는 단위 행렬에서 row1과 row2를 교환한 행렬을 뜻한다. 자세한 사항은 lecture 4의 마지막 부분을 참고하자. 


이러한 치환 행렬의 조합은 n!(factorial)만큼 된다. 즉 n=3일 때, 3x2x1=6가지 조합이 나올 수 있는 것이다. 



치환 행렬은 편리한 속성이 두 가지 있다. 

첫 번째는 모든 P행렬은 invertible하다. 즉 역행렬이 존재한다. (역행렬이 존재하는 단위행렬에서 행만 바꿨으므로 당연히...)

두 번째는 P행렬의 역행렬은 전치(Transpose)행렬과 같다. 즉 아래 식을 만족한다. (이 속성은 굉장히 편리하다)





2. Transpose


전치(Transpose)는 지난 포스팅에서도 잠깐 언급했지만, 좀 더 자세히 살펴보도록 하자. 일단 무작정 전치라는 연산을 한 번 해보자. 아래 행렬을 보자. 



왼쪽의 3x2 행렬을 전치 했더니 오른쪽의 2x3형태의 행렬이 됐다. 쉽게 생각하면 행렬의 전치는 뒤집기다. 대각선을 축으로 180도 뒤집었다고 생각하면 된다. 그런데 행렬의 차원을 보니 row의 차원이 column차원으로, column의 차원이 row의 차원으로 변한 것을 볼 수 있다. 즉 row와 column이 바뀐 것으로 생각하면 된다. 이에 대한 정의를 아래와 같이 쓸 수 있다. 




i는 row의 인덱스, j는 column의 인덱스인데 전치를 하면 이 두 인덱스가 바뀌게 된다. 즉 식 (6)에서 2를 보면 전치를 하기 전엔 A(2,1)이었지만, 전치를 한 후엔 A(1,2)의 자리로 간 것을 볼 수 있다. 





3. 대칭 행렬(Symmetric Matrix)


이번에 알아볼 행렬의 형태는 특별한 형태이면서도 어떻게 보면 최고의 행렬 형태라고도 볼 수 있다. 바로 대칭 행렬(Symmetric Matrix)인데, 이 행렬이 가지고 있는 특성 때문에 다양한 곳에 응용된다. 

이름 그대로 이 행렬의 특성은 대칭이라는 것이다. 즉 전치(Transpose)를 해서 행렬을 뒤집어도 원래 행렬과 같은 특성을 가진다. 아래 예를 보자. 



식(8)의 행렬 A는 대칭 행렬이다. 일단 대각(diagonal) 원소를 보자. 대각 원소는 diag(3, 2, 4)인데, 이 대각 원소를 기준으로 상삼각(Upper triangular)과 하삼각(Lower Triangular) 부분이 같은 것을 알 수 있다. 따라서 전치를 통해 행렬을 대각 원소를 중심축으로 뒤집어도 그 결과는 같으며 차원 또한 변함이 없다. 


그렇다면 우리는 이러한 대칭 행렬을 언제, 어떻게 구할 수 있을 까? 식 (6)의 R행렬을 다시 보자. 



위의 R행렬은 대칭 행렬과는 거리가 많이 멀어보인다. R의 전치 행렬도 마찬가지다. 둘 다 직사각형 모양이다. 하지만! 우리는 이렇게 대칭 행렬과는 거리가 아주 멀어 보이는 행렬을 가지고 대칭 행렬을 얻을 수 있다. 바로 저 둘을 곱하면 된다. 실제로 한 번 해보자. 



R행렬을 R의 전치 행렬과 곱했더니 우측의 S행렬이 나왔다. S행렬을 보면 대각 원소들을 기준으로 대칭인것을 한 눈에 알 수 있다. 이렇듯 어떤 행렬을 자신의 전치 행렬과 곱한 결과가 대칭 행렬이 나오는 이유는 다음과 같다. 자신과 똑같은 행렬을 단지 뒤집어서 곱했기 때문에 똑같은 원소 끼리의 곱이 반복될 수 밖에 없다. 아래의 연산 순서를 보자. 


 식 (10)은 식 (9)의 곱셈 과정을 순차적으로 나열한 것이다. 이를 보면 두 번째 연산과 네 번째 연산이 같은 원소끼리의 곱이 반복됨을 알 수 있다. 이렇게 같은 원소끼리 반복되는 연산은 대각 원소를 제외한 모든 원소에서 발생한다. 이러한 연산은 결코 우연이 아니라 필연적으로 일어날 수 밖에 없는 것이다. 결론적으로 아래의 정의를 얻을 수 있다. 


어떤 임의의 행렬 A와 그의 전치 행렬(Transpose)을 곱하면 항상 대칭 행렬(Symmetric Matrix)을 얻는다!


위 정의를 수식으로 증명하자면 아래와 같다. 어떤 행렬이 대칭 행렬인지를 알기 위해선, 전치를 해 봤을 때 원래의 행렬과 같으면 우리는 이 행렬이 대칭 행렬인지를 알 수 있다. 



전치의 전치는? 당연히 원래의 행렬일 것이다. 결과를 보라. 전치를 하기 전의 행렬과 같은 것을 알 수 있다. 위의 중요한 정의를 잘 기억해두자. 




3. 마치며


이번 포스팅에선 치환 행렬(Permutation Matrix)과 전치(Transposes), 그리고 대칭 행렬(Symmetric Matrix)에 대해 알아보았다. 치환 행렬은 어떤 행렬의 왼쪽에 곱해져서 행 교환(row exchange)연산을 수행하고 전치는 row와 column의 index를 바꾸는 연산이다. 쉽게 말해 행렬을 대각선을 기준축으로 180도 회전시키는 것이다. 마지막으로 대칭 행렬에 대해 알아보았고, 대칭 행렬은 대각 원소를 기준으로 상삼각행렬과 하삼각행렬의 원소가 같은 행렬이며 전치 행렬이 원래 자기 자신과 같은 행렬임을 알았다. 또한 임의의 rectangular행렬 A에 대해 A의 전치 행렬에 A를 다시 곱하면 항상 대칭 행렬이 나옴을 알 수 있었다. 다음 포스팅에선 벡터 공간(Vector Spaces)에 대해 공부해 보도록 하자. 


+ Recent posts