R 에서 행렬의 곱 역행렬 전치행렬 구하기
개요
R 의 강점은 행렬을 위시한 각종 데이터셋의 조작이 간편하다는 점과 풍부한 통계 패키지를 무료로 제공한다는 것이다. 당연한 이야기지만 통계적 분석에서 행렬의 계산은 매우 중요하고, R 은 이러한 니즈를 훌륭하게 충족시켜준다. 매트랩이나 줄리아가 아닌 이상 다른 언어에선 행렬의 연산부터 귀찮게 따로 정의를 해줘야 할 것이다.
코드
행렬의 곱
예로써 행렬 $a = \begin{bmatrix} 2 & 1 & 0 \\ 1 & 2 & 1 \\ 0 & 1 & 2 \end{bmatrix}$ 의 $2$행와 $3$행을 바꾸고 싶다고 해보자. 선형대수학에선 순열 행렬 $P = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix}$ 을 $A$ 의 왼쪽에 곱하면 원하는 결과를 얻을 수 있다. 즉, $PA = \begin{bmatrix} 2 & 1 & 0 \\ 0 & 1 & 2 \\ 1 & 2 & 1 \end{bmatrix}$ 다. 이 계산을 R 에서 행렬을 곱하는 연산자 %*% 를 통해 구현해보자.
A = matrix(c(2,1,0,1,2,1,0,1,2),ncol=3); A
P = matrix(c(1,0,0,0,0,1,0,1,0),ncol=3); P
P%*%A
위 코드를 실행 시킨 결과는 아래와 같다.
역행렬과 전치행렬
이론적인 계산과 정확히 맞아 떨어지는 것을 확인할 수 있다. $PA = B$, 즉 이렇게 구한 행렬을 $B$ 로 정의하고 계속해서 역행렬과 전치행렬을 구해보자.
B=P%*%A; B
solve(B)
t(B)
역행렬을 구하는 함수는 solve()
, 전치행렬을 구하는 함수는 t()
다.Transpose에서 t()
가 나온 것은 쉽게 짐작할 수 있다. 반면 역행렬을 inverse()도 아니고 solve()
로 정의한 이유는 연립방정식 $A \mathbf{x} = \mathbf{b}$ 가 있다고 할 때, 해가 $\mathbf{x} = A ^{-1} \mathbf{b}$ 로 주어지기 때문이다. 역행렬을 구하는 것은 곧 문제를 푼다는 의미와 같다.
위 코드를 실행시킨 결과는 아래와 같다.
전치행렬은 그저 행과 열을 반전시킬 뿐이므로 한 눈에 결과를 확인할 수 있다. 역행렬은 $$ B^{-1} = \begin{bmatrix} {{3}\over{4}} & {{1}\over{4}} & -{{1}\over{2}} \\ -{{1}\over{2}} & -{{1}\over{2}} & 1 \\ {{1}\over{4}} & {{3}\over{4}} & -{{1}\over{2}} \end{bmatrix} = {{1}\over {4}} \begin{bmatrix} 3 & 1 & -2 \\ -2 & -2 & 4 \\ 1 & 3 & -2 \end{bmatrix} $$ 으로 계산되었는데, 직접 구하긴 힘드니까 검산만 해보도록 하자. $$ B^{-1} B = {{1}\over {4}} \begin{bmatrix} 3 & 1 & -2 \\ -2 & -2 & 4 \\ 1 & 3 & -2 \end{bmatrix} \begin{bmatrix} 2 & 1 & 0 \\ 0 & 1 & 2 \\ 1 & 2 & 1 \end{bmatrix} = {{1}\over {4}} \begin{bmatrix} 4 & 0 & 0 \\ 0 & 4 & 0 \\ 0 & 0 & 4 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} $$