1.6 행렬과 배열(Matrces & Arrays)
행렬(matrix)은 행과 열의 차원(dimension)
을 갖는 벡터이다:
<- rep(1, 20) # 1을 20번 복사. 변수 m은 모든 요소가 1인 벡터
m dim(m) <- c(5,4) # 차원을 5 & 4로 설정 : 즉, m은 이제 5x4 행렬
행렬의 생성 : matrix():
함수의 사용
<- matrix(data=1, nrow=5, ncol=4) # 위의 행렬과 동일.
m # 1의 요소 값(자동 반복)을 갖는 5x4 행렬
<- matrix(1,5,4) # 위의 행렬과 같음. (인수의 키워드 생략 가능)
m
# 행렬의 차원 확인 : dim() 함수의 사용
dim(m)
## [1] 5 4
벡터 결합에 의한 행렬 생성 : cbind()
함수와 rbind()
함수의 사용
<- 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) m[
## [1] 2
# 행/열의 선택
2,] # 행렬 m의 2번째 행 전체 : 벡터 m[
## [1] 2 2 2 2 2 2 2 2 2 2
2] # 행렬 m의 2번째 열 전체 : 벡터 m[,
## [1] 1 2 3 4 5 6 7 8 9 10
# 복수 개 행/열의 선택 : 부분 행렬(submatrix)
1:2,4:6] # 부분 행렬 : (1, 2)행과 (4, 5, 6) 열로 구성된 행렬 m[
## [,1] [,2] [,3]
## [1,] 1 1 1
## [2,] 2 2 2
# 행/열의 제외 : '-'
-1,] # 1번째 행을 제외한 부분 행렬 m[
## [,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 열의 요소들과 같은가?
1,]==m[,1] m[
## [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 논리 행렬 : m의 요소 값이 3보다 크면 TRUE, 아니면 FALSE :
<- m > 3
l 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
<- t(m) # mt는 m의 전치행렬 : 행과 열의 위치가 바뀐 행렬
mt
# 행렬 곱 연산 : %*% 연산자 사용
%*% mt # %*% 연산자는 행렬 곱 m
## [,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()
함수로 생성할 수 있다:
<- array(data=1:18, dim=c(3, 3, 2)) # 세 번째 차원을 갖는 배열 : 3x3x2
a # 3x3 행렬이 두 개 있는 것
<- array(1:18, c(3, 3, 2)) # 동일한 배열 a