R 의 강점은 행렬을 위시한 각종 데이터셋의 조작이 간편하다는 점과 풍부한 통계 패키지를 무료로 제공한다는 것이다. 당연한 이야기지만 통계적 분석에서 행렬의 계산은 매우 중요하고, R 은 이러한 니즈를 훌륭하게 충족시켜준다. 매트랩이나 줄리아가 아닌 이상 다른 언어에선 행렬의 연산부터 귀찮게 따로 정의를 해줘야 할 것이다.
코드
행렬의 곱
예로써 행렬 a=210121012 의 2행와 3행을 바꾸고 싶다고 해보자. 선형대수학에선 순열 행렬 P=100001010 을 A 의 왼쪽에 곱하면 원하는 결과를 얻을 수 있다. 즉, PA=201112021 다. 이 계산을 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()로 정의한 이유는 연립방정식 Ax=b 가 있다고 할 때, 해가 x=A−1b 로 주어지기 때문이다. 역행렬을 구하는 것은 곧 문제를 푼다는 의미와 같다.
위 코드를 실행시킨 결과는 아래와 같다.
전치행렬은 그저 행과 열을 반전시킬 뿐이므로 한 눈에 결과를 확인할 수 있다. 역행렬은
B−1=43−214141−2143−211−21=413−211−23−24−2
으로 계산되었는데, 직접 구하긴 힘드니까 검산만 해보도록 하자.
B−1B=413−211−23−24−2201112021=41400040004=100010001