R

[R 프로그래밍] matrix(행렬)

동호다찌 2022. 12. 21. 15:17

matrix(행렬)

1차원 데이터를 저장하기 위해서는 vector라고 하는 자료 구조에 저장을 했습니다. 

 

이제는 2차원 데이터를 저장하는 내용을 학습을 시작할 텐데요. 보통 분석을 위해서 데이터를 얻게 되면 1차원 데이터인 경우도 많이 있습니다. 그렇지만 거의 대부분은 2차원 형태 엑셀의 테이블 형태로 되어있는 자료 구조가 대부분입니다. 

 

그래서 R에서는 이런 2차원 형태의 데이터를 저장하기 위해서 matrix하고 data fame이라고 하는 장치를 제공합니다. 

 

matrix와 data fame 둘 다 2차원 데이터를 저장할 수 있습니다. 그런데 matrix는 그 matrix에 저장되는 모든 자료의 종류가 동일해야 합니다. 그에 비해서 data fame은 2차원 데이터를 저장하는데, 숫자와 문자 이런 것들을 섞어서 저장할 수 있습니다.

 

> A <- matrix(c(2,12,5,6,3,31,13,35,5,5,7,72), ncol= 3);
> A
     [,1] [,2] [,3]
[1,]    2    3    5
[2,]   12   31    5
[3,]    5   13    7
[4,]    6   35   72

matrix(행렬)의 생성

matrix()함수 이용

X1 <- matrix(1:20, nrow=2, ncol=5);
Warning message:
In matrix(1:20, nrow = 2, ncol = 5) :
  data length differs from size of matrix: [20 != 2 x 5]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10


> X1 <- matrix(1:20, nrow=4, ncol=5); 
> X1
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

 

대각행렬(diagonal matrix) 생성

> X2 <- diag(1,5);
> X2
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    1    0    0    0
[3,]    0    0    1    0    0
[4,]    0    0    0    1    0
[5,]    0    0    0    0    1
> X2 <- diag(10);
> X2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    0    0    0    0    0    0    0    0     0
 [2,]    0    1    0    0    0    0    0    0    0     0
 [3,]    0    0    1    0    0    0    0    0    0     0
 [4,]    0    0    0    1    0    0    0    0    0     0
 [5,]    0    0    0    0    1    0    0    0    0     0
 [6,]    0    0    0    0    0    1    0    0    0     0
 [7,]    0    0    0    0    0    0    1    0    0     0
 [8,]    0    0    0    0    0    0    0    1    0     0
 [9,]    0    0    0    0    0    0    0    0    1     0
[10,]    0    0    0    0    0    0    0    0    0     1


> X2 <- diag(1:10);
> X2
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    0    0    0    0    0    0    0    0     0
 [2,]    0    2    0    0    0    0    0    0    0     0
 [3,]    0    0    3    0    0    0    0    0    0     0
 [4,]    0    0    0    4    0    0    0    0    0     0
 [5,]    0    0    0    0    5    0    0    0    0     0
 [6,]    0    0    0    0    0    6    0    0    0     0
 [7,]    0    0    0    0    0    0    7    0    0     0
 [8,]    0    0    0    0    0    0    0    8    0     0
 [9,]    0    0    0    0    0    0    0    0    9     0
[10,]    0    0    0    0    0    0    0    0    0    10


> X2 <- diag(c(1,3,5,7,9));
> X2
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    3    0    0    0
[3,]    0    0    5    0    0
[4,]    0    0    0    7    0
[5,]    0    0    0    0    9

 

대각원소(diagonal elements)의 추출

> diag(X2)
[1] 1 3 5 7 9

행렬/벡터의 결합

열 단위 결합

> x <- c(1,2,3); 
> y <- c(4,5,6);
> cbind(x,y)
     x y
[1,] 1 4
[2,] 2 5
[3,] 3 6

 

행 단위 결합

> x <- c(1,2,3); 
> y <- c(4,5,6);

> rbind(x,y)
  [,1] [,2] [,3]
x    1    2    3
y    4    5    6

행렬 연산

곱 (elementwise product)

> x <- matrix(c(1:6), ncol=3); 
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6


> y <- matrix(c(1,-1,2,3,2,-1), ncol=3); 
> y
     [,1] [,2] [,3]
[1,]    1    2    2
[2,]   -1    3   -1


> x * y
     [,1] [,2] [,3]
[1,]    1    6   10
[2,]   -2   12   -6

 

 

전치행렬 (transpose matrix)

> x <- matrix(c(1:6), ncol=3); 
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> t(x)
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

 

행렬곱 (matrix product)

> x <- matrix(c(1:6), ncol=3);
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> y <- matrix(c(1,-1,2,3,2,-1), ncol=3);
     [,1] [,2] [,3]
[1,]    1    2    2
[2,]   -1    3   -1


> t(x)
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

> z <- t(x)%*%y; 
> z
     [,1] [,2] [,3]
[1,]   -1    8    0
[2,]   -1   18    2
[3,]   -1   28    4

 

 

역행렬 (matrix inversion)

A가 n×n 행렬일 때, 아래를 만족하는 n×n 행렬 B가 존재하면 B를 A의 역행렬이라고 하고 A−1로 표시함

> A <- matrix(c(1,2,3,3,0,1,5,4,2), ncol=3); 
> A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    0    4
[3,]    3    1    2

> solve(A)
            [,1]        [,2] [,3]
[1,] -0.13333333 -0.03333333  0.4
[2,]  0.26666667 -0.43333333  0.2
[3,]  0.06666667  0.26666667 -0.2