1.6 행렬과 배열(Matrces & Arrays)

행렬(matrix)행과 열의 차원(dimension)을 갖는 벡터이다:

m <- rep(1, 20)   # 1을 20번 복사. 변수 m은 모든 요소가 1인 벡터
dim(m) <- c(5,4)  # 차원을 5 & 4로 설정 : 즉, m은 이제 5x4 행렬

행렬의 생성 : matrix(): 함수의 사용

m <- matrix(data=1, nrow=5, ncol=4)  # 위의 행렬과 동일. 
                                     # 1의 요소 값(자동 반복)을 갖는 5x4 행렬
m <- matrix(1,5,4)                   # 위의 행렬과 같음. (인수의 키워드 생략 가능)

# 행렬의 차원 확인 : dim() 함수의 사용
dim(m)
## [1] 5 4

벡터 결합에 의한 행렬 생성 : cbind() 함수와 rbind() 함수의 사용

m <- cbind(1:5, 5:1, 5:9)  # 3개의 벡터들을 컬럼(column, 열) 단위로 결합. 5x3 행렬
m <- rbind(1:5, 5:1, 5:9)  # 3개의 벡터들을 로(row, 행) 단위로 결합. 3x5 행렬

행렬 요소의 선택 :

# 행렬의 생성
m <- matrix(1:10,10,10)

## 행렬 요소의 선택 : m[행번호, 열번호]
# 단일 요소의 선택
m[2,3]      # 행렬 m의 2행, 3열 요소 - 단일 요소(cell)
## [1] 2
# 행/열의 선택
m[2,]       # 행렬 m의 2번째 행 전체 : 벡터
##  [1] 2 2 2 2 2 2 2 2 2 2
m[,2]       # 행렬 m의 2번째 열 전체 : 벡터
##  [1]  1  2  3  4  5  6  7  8  9 10
# 복수 개 행/열의 선택 : 부분 행렬(submatrix)
m[1:2,4:6]  # 부분 행렬 : (1, 2)행과 (4, 5, 6) 열로 구성된 행렬
##      [,1] [,2] [,3]
## [1,]    1    1    1
## [2,]    2    2    2
# 행/열의 제외 : '-'
m[-1,]      # 1번째 행을 제외한 부분 행렬
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    2    2    2    2    2    2    2    2    2     2
##  [2,]    3    3    3    3    3    3    3    3    3     3
##  [3,]    4    4    4    4    4    4    4    4    4     4
##  [4,]    5    5    5    5    5    5    5    5    5     5
##  [5,]    6    6    6    6    6    6    6    6    6     6
##  [6,]    7    7    7    7    7    7    7    7    7     7
##  [7,]    8    8    8    8    8    8    8    8    8     8
##  [8,]    9    9    9    9    9    9    9    9    9     9
##  [9,]   10   10   10   10   10   10   10   10   10    10

행렬의 연산 :

# 1 행의 요소들이 1 열의 요소들과 같은가? 
m[1,]==m[,1] 
##  [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 논리 행렬 : m의 요소 값이 3보다 크면 TRUE, 아니면 FALSE :
l <- m > 3 
l
##        [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
##  [1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [4,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [5,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [6,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [7,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [8,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [9,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
## [10,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
# 논리 벡터 l의 요소가 TRUE인 m의 요소 선택 : 즉, 요소 값이 3보가 큰 요소 선택
m[l]
##  [1]  4  5  6  7  8  9 10  4  5  6  7  8  9 10  4  5  6  7  8  9 10  4  5  6  7
## [26]  8  9 10  4  5  6  7  8  9 10  4  5  6  7  8  9 10  4  5  6  7  8  9 10  4
## [51]  5  6  7  8  9 10  4  5  6  7  8  9 10  4  5  6  7  8  9 10
# 전치 행렬(transpose matrix) : t() 함수의 사용
t(m)
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    2    3    4    5    6    7    8    9    10
##  [2,]    1    2    3    4    5    6    7    8    9    10
##  [3,]    1    2    3    4    5    6    7    8    9    10
##  [4,]    1    2    3    4    5    6    7    8    9    10
##  [5,]    1    2    3    4    5    6    7    8    9    10
##  [6,]    1    2    3    4    5    6    7    8    9    10
##  [7,]    1    2    3    4    5    6    7    8    9    10
##  [8,]    1    2    3    4    5    6    7    8    9    10
##  [9,]    1    2    3    4    5    6    7    8    9    10
## [10,]    1    2    3    4    5    6    7    8    9    10
mt <- t(m)     # mt는 m의 전치행렬 : 행과 열의 위치가 바뀐 행렬

# 행렬 곱 연산 : %*% 연산자 사용
m %*% mt       # %*% 연산자는 행렬 곱
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]   10   20   30   40   50   60   70   80   90   100
##  [2,]   20   40   60   80  100  120  140  160  180   200
##  [3,]   30   60   90  120  150  180  210  240  270   300
##  [4,]   40   80  120  160  200  240  280  320  360   400
##  [5,]   50  100  150  200  250  300  350  400  450   500
##  [6,]   60  120  180  240  300  360  420  480  540   600
##  [7,]   70  140  210  280  350  420  490  560  630   700
##  [8,]   80  160  240  320  400  480  560  640  720   800
##  [9,]   90  180  270  360  450  540  630  720  810   900
## [10,]  100  200  300  400  500  600  700  800  900  1000
m * m          # * 는 행렬의 요소별 곱하기
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    1    1    1    1    1    1    1    1     1
##  [2,]    4    4    4    4    4    4    4    4    4     4
##  [3,]    9    9    9    9    9    9    9    9    9     9
##  [4,]   16   16   16   16   16   16   16   16   16    16
##  [5,]   25   25   25   25   25   25   25   25   25    25
##  [6,]   36   36   36   36   36   36   36   36   36    36
##  [7,]   49   49   49   49   49   49   49   49   49    49
##  [8,]   64   64   64   64   64   64   64   64   64    64
##  [9,]   81   81   81   81   81   81   81   81   81    81
## [10,]  100  100  100  100  100  100  100  100  100   100

배열(Arrays)은 2보다 큰 차원을 다룬다.

배열은 array() 함수로 생성할 수 있다:

a <- array(data=1:18, dim=c(3, 3, 2))    # 세 번째 차원을 갖는 배열 : 3x3x2
                                         # 3x3 행렬이 두 개 있는 것
a <- array(1:18, c(3, 3, 2))             # 동일한 배열