인포위드

R프로그래밍 matrix(행렬) 기본활용 본문

R

R프로그래밍 matrix(행렬) 기본활용

JSE99 2020. 3. 23. 22:12

안녕하세요 인포위드 입니다.

이번 포스팅에서는 R프로그래밍 matrix(행렬) 기본활용에 대해서 알려드리도록 하겠습니다.

1. matrix(행렬)이란? 

matrix(행렬)이란 행(row)과 열(column)로 구성된 2차원 자료의 저장형태를 뜻합니다.

먼저 matrix(행렬)을 생성할려면 기본적으로 matrix(c(  ,  ,  ,  ,))의 형태를 갖추어야 합니다.


A1 = matrix(c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=3)
A2 = matrix(c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=2)
A3 = matrix(c(1,2,3,4,5,6,7,8,9,10,11,12),ncol=1)

 

위와 같이 A1, A2, A3라는 matrix 데이터들을 만들어보았습니다.

해당 코드를 실행시켜보도록 할게요.

matrix 함수를 이용해 A1, A2 , A3를 만들어보았는데 matrix코드를 사용하면

이처럼 행렬의 형태를 갖춘 데이터 구조들을 생성할수 있습니다. 

 

R에서 ncol은 matrix에서 세로열을 뜻합니다. 

예를 들어 ncol=3, matrix의 세로열이 3개가 구성되어야 한다는 뜻으로 이해하시면 편합니다. 


위에서는 ncol만 지정해서 matrix를 생성해보았는데 이번에는

nrow와 ncol을 각각 지정해서 matrix를 생성해보도록 하겠습니다. 

x1 = matrix(1:30, nrow=3, ncol=5)

해당 코드를 R에서 실행시킨 결과

아래와 같은 결과값이 나왔습니다.

위에서도 설명한것처럼 ncol은 열이 5개가 되도록 matrix를 구성하는 코드입니다.

위와 다르게 nrow가 생겼는데 nrow도 똑같은 원리로 행이 3개가 되도록 구성하는 코드라고 생각하시면 됩니다.

즉 열5개 행3개로 이루어진 x1이라는 데이터를 만드는 코드인것이죠.

 

2. diag 함수를 이용해서 대각행렬 만들기

이번에는 diag함수를 이용해서 대각행렬을 만들어보도록 하겠습니다.


a1 = diag(1,3)
a2 = diag(3)
a3 = diag(1:3)
a4 = diag(c(1,2,4,7,9))

 

위 코드를 실행시켜보면 아래와 같은 결과가 나옵니다.

diag 함수를 이용해서 코드를 작성하면 이런식으로

대각행렬의 형태를 만들수 있습니다.

 

위에 적어둔 예시코드처럼 diag(1,3)이면 대각선 방향으로 111이 생기는거라고 생각하시면 이해하기 편해집니다.

만약 코드가 diag(1,2,4,7,9)이면 대각선 방향으로 순서대로 1,2,4,7,9가 나오게 됩니다.


diag 함수를 이용해서 대각행렬을 만들어보았는데 diag함수를 이용해 추출도 가능합니다.


a3 = diag(1:3)
diag(a3)

diag(1:3)으로 구성된를 만들어주면

아래처럼 대각행렬이 나옵니다.

여기서 diag(a3)라는 코드릅 입력하면

diag함수를 추출할수 있는것이죠.

3. cbind(), rbind()를 이용한 결합

R공부를 하다보면 상당히 많이 쓰이는 함수가 cbind(), rbind() 함수입니다.

벡터를 결합시켜주는 함수인데 알아두면 정말로 도움이 많이 되는 코드입니다.


# column(열)기준으로 결합은 -> cbind
x= c(1,2,3,4)
y=c(4,5)
cbind(x,y)
# row(행) 기준으로 결합은 -> rbind
rbind(x,y)

위 코드와 같이 x,y라는 데이터를 만들어준후 열기준으로 결합하고 싶다면 cbind

행기준으로 결합하고 싶다면 rbind를 사용해주시면 됩니다.

cbind(x,y)로 결합한결과 x,y가 열 기준으로 구성된것을 확인할수 있습니다.

반대로 rbind(x,y)는 행기준으로 구성된것을 확인할수 있구요.

 

cbind(), rbind()는 진짜 많이 쓰이는 코드니까 숙지하시길 바랍니다.

3. 행렬의 곱, 전치행렬, 역행렬 구하기 

마지막으로 행렬의 곱, 전치행렬, 역행렬을 구해보고 포스팅 마치도록 할게요.

일단 R에서 행렬의 곱은 %*%라는 코드를 이용해서 구할수 있습니다. 

일반 곱셈은 2*2 이런식으로 적으면되는데 행렬에서의 곱은 A%*%B 이런식으로 적어야합니다.

 

바로 코드예시를 들면서 설명을 하도록 할게요.


x = matrix(c(1:9), ncol=3)
y = matrix(c(-9:-1), ncol=3)
z = x%*%y

matrix()함수를 이용해서 x,y라는 행렬을 만들어 주었습니다. 

여기서 행렬의 곱셈값을 알고싶다면 x%*%y라는 코드를 적어야 올바른 값을 구할수있습니다.


만약에 그냥 x*y 처럼 *로 곱셈하면 어떤결과가 나오는지 궁금하신분들이 계실수도 있을텐데요.

코드자체는 성립합니다.


x = matrix(c(1:9), ncol=3)
y = matrix(c(-9:-1), ncol=3)
x*y

x*y값을 R에서 돌리면 아래와 같은 결과가 나옵니다.

%*%를 이용했을때의 값과 상당히 차이가 나는데요.

도대체 *랑 %*%는 무슨차이가 있을까요?

 

행렬에서 *를 이용한 곱셈은 하마다드 곱셈을 실행시키는걸 의미합니다.

 

하마다드 곱셈이란 단순히 같은위치에 있는 데이터들끼리 곱셈을 한다고 생각하시면 됩니다.

하마다드 곱셈에 대해서는 얘기를 하면 너무 길어지기 때문에 따로 언급하지는 않도록 하겠습니다.

 

결론적으로 행렬에서는 %*%를 이용해야만 진정한 행렬의 곱셈값을 알아낼수 있는것이죠.


다음은 전치행렬을 구해보도록 하겠습니다. 

전치행렬도 쉽습니다.


a = matrix(c(1:6), ncol=3)
t(a)

a라는 행렬을 생성한뒤에 t() 함수를 이용해서 전치행렬을 구해보았습니다.

결과를 보시면 아시겠지만 t() 함수는

단순하게 a라는 행렬에서 행과 열의 위치를 바꾸는 코드라고 생각하시면 됩니다.


마지막으로 역행렬을 알아보고 마치도록 하겠습니다.

바로 코드 예시먼저 들겠습니다.


A = matrix(c(1,1,2,2,3,3,4,4,5), ncol=3)
solve(A)

matrix() 함수를 이용해서 A를 만들어주고 solve(A)라는 코드를 이용하면

위에 나온 결과처럼 A의 역함수를 구할 수 있습니다.


이번 포스팅에서는 matrix 구조와 diag()함수 및 cbind() 와 rbind() 함수를 이용한 결합,

행렬의곱, 전치행렬, 역행렬에 대해서 알아보았습니다.

 

해당 포스팅이 도움 되시길 바라면서 이번 포스팅은 여기서 마치도록 하겠습니다.
포스팅 읽어주셔서 감사합니다.

 

Comments