작성일자 : 2023-09-28
Ver 0.1.1
Matrix
- Maxtrix는 2차원 자료구조를 가지고 있으며, 한 matrix에 속한 모든 원소는 모두 동일한 자료형을 갖는다.
- 특성 : mode, length, dim(차원), dimnames(차원의 이름)
- Examples
Matrix 만들기 1 : rbind() 함수의 이용
row1 = c( 7 , 1 , 8 )
row2 = c( 4 , 6 , 7 )
row3 = c( 3 , 4 , 5 )
A1 = rbind( row1 , row2 , row3 )
A1
## [,1] [,2] [,3]
## row1 7 1 8
## row2 4 6 7
## row3 3 4 5
Matrix 만들기 2 : cbind() 함수의 이용
col1 = c( 7 , 4 , 3 )
col2 = c( 1 , 6 , 4 )
col3 = c( 8 , 7 , 5 )
A1 = cbind( col1 , col2 , col3 )
A1
## col1 col2 col3
## [1,] 7 1 8
## [2,] 4 6 7
## [3,] 3 4 5
Matrix 만들기 3 : matrix() 함수의 이용
vec1 = c( 7 , 4 , 3 , 1 , 6 , 4 , 8 , 7 , 5 )
matrix( vec1 , nrow = 3 )
## [,1] [,2] [,3]
## [1,] 7 1 8
## [2,] 4 6 7
## [3,] 3 4 5
vec2 = c( 7 , 1 , 8 , 4 , 6 , 7 , 3 , 4 , 5 )
matrix( vec2 , ncol = 3 , byrow = T )
## [,1] [,2] [,3]
## [1,] 7 1 8
## [2,] 4 6 7
## [3,] 3 4 5
Matrix 만들기 4 : dim() 함수의 이용
A1 = c( 7 , 4 , 3 , 1 , 6 , 4 , 8 , 7 , 5 )
dim( A1 ) = c( 3 , 3 )
A1
## [,1] [,2] [,3]
## [1,] 7 1 8
## [2,] 4 6 7
## [3,] 3 4 5
행 벡터(row vector), 열 벡터(column vector)
matrix( 1:4 , nrow = 1 ) # row vector
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
matrix( 1:4 , ncol = 1 ) # column vector
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
대각행렬(diagonal matrix)과 단위행렬(identity matrix)
diag( 1:3 ) # diagonal matrix of 1,2,3
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 2 0
## [3,] 0 0 3
diag( rep( 1 , 3 ) ) # 3-dim. diagonal matrix of 1
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
A1
## [,1] [,2] [,3]
## [1,] 7 1 8
## [2,] 4 6 7
## [3,] 3 4 5
diag( A1 )
## [1] 7 6 5
diag( diag( A1 ) ) # 행렬로부터 대각원소를 추출하여 벡터형태로 만들고, 이를 다시 대각원소로 하는 대각행렬을 만듦
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
diag( 3 ) # 3x3의 단위행렬
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
Matrix의 연산
mat1 = matrix( 1:4 , nrow = 2 )
mat2 = diag( c( 5 , 10 ) )
mat1
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
mat2
## [,1] [,2]
## [1,] 5 0
## [2,] 0 10
mat1 + mat2
## [,1] [,2]
## [1,] 6 3
## [2,] 2 14
mat1 * mat2
## [,1] [,2]
## [1,] 5 0
## [2,] 0 40
mat1 %*% mat2
## [,1] [,2]
## [1,] 5 30
## [2,] 10 40
solve( mat1 )
## [,1] [,2]
## [1,] -2 1.5
## [2,] 1 -0.5
solve( mat1 ) %*% mat1
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
t( mat1 )
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
- 함수 solve()는 정방행렬의 역행렬(inverse matrix)을 출력.
- 함수 t()는 임의의 행렬의 전치행렬(transpose matrix)을 출력
Matrix와 scalar간의 연산
mat1
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
mat1 * 3
## [,1] [,2]
## [1,] 3 6
## [2,] 9 12
mat1 / 3
## [,1] [,2]
## [1,] 0.333 1.000
## [2,] 0.667 1.333
mat1 + 3
## [,1] [,2]
## [1,] 4 6
## [2,] 5 7
3 - mat1
## [,1] [,2]
## [1,] 2 0
## [2,] 1 -1
rbind( 1 , mat1 )
## [,1] [,2]
## [1,] 1 1
## [2,] 1 3
## [3,] 2 4
Matrix와 vector 간의 연산
mat3 = matrix( 1:16 , nrow = 4 )
mat3
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
mat3 + c( 10 , 20 )
## [,1] [,2] [,3] [,4]
## [1,] 11 15 19 23
## [2,] 22 26 30 34
## [3,] 13 17 21 25
## [4,] 24 28 32 36
mat3 / c( 10 , 20 )
## [,1] [,2] [,3] [,4]
## [1,] 0.1 0.5 0.9 1.3
## [2,] 0.1 0.3 0.5 0.7
## [3,] 0.3 0.7 1.1 1.5
## [4,] 0.2 0.4 0.6 0.8
mat3 + c( 10 , 20 , 30 )
Warning in mat3 + c(10,20,30) : longer object length is not a multiple of shortre object length
## [,1] [,2] [,3] [,4]
## [1,] 11 25 39 23
## [2,] 22 36 20 34
## [3,] 33 17 31 45
## [4,] 14 28 42 26
Matrix의 특성
logical.mat1 = matrix( c( T , T , F , T ) , nrow = 2 )
logical.mat1
## [,1] [,2]
## [1,] TRUE FALSE
## [2,] TRUE TRUE
mode( logical.mat1 )
## [1] "logical"
dim( logical.mat1 )
## [1] 2 2
nrow( logical.mat1 )
## [1] 2
ncol( logical.mat1 )
## [1] 2
length( logical.mat1 )
## [1] 4
dimnames( logical.mat1 )
## [1] NULL
dimnames( logical.mat1 ) = list( c( 'row1' , 'row2' ) , c( 'col1' , 'col2' ) )
logical.mat1
## col1 col2
## row1 TRUE FALSE
## row2 TRUE TRUE
dimnames( logical.mat1 )
##[[1]]
##[1] "row1" "row2"
##
##[[2]]
##[1] "col1" "col2"
rownames( logical.mat1 )
##[1] "row1" "row2"
colnames( logical.mat1 )
##[1] "col1" "col2"
- 함수 mode()는 객체의 원소의 자료형을 출력.
- 함수 dim()은 matrix 혹은 data frame, array의 차원을 출력.
- 함수 nrow()와 ncol()은 matrix 또는 data frame의 행의 차원과 열의 차원을 출력.
- 함수 length()는 객체의 원소 개수를 출력.
- 함수 dimnames()는 객체의 차원에 부여된 이름을 출력.
- 함수 rownames()는 객체의 행에 부여된 이름을 출력.
- 함수 colnames()는 객체의 열에 부여된 이름을 출력.
Matrix의 원소 추출 및 처리
mat4 = matrix( 1:9 , nrow = 3 )^2
mat4
## [,1] [,2] [,3]
## [1,] 1 16 49
## [2,] 4 25 64
## [3,] 9 36 81
mat4[ 2 , 3 ] # 2행 3열 위치의 원소를 추출
## [1] 64
mat4[ c( 2 , 3 ) , -2 ] # 2열 위치의 원소를 제외한 2행과 3행의 원소 추출
## [,1] [,2]
## [1,] 4 64
## [2,] 9 81
mat4[ T , c( T , F , T ) ] # 1열과 3열에 놓인 원소를 추출
## [,1] [,2]
## [1,] 1 49
## [2,] 4 64
## [3,] 9 81
mat4 = mat4 + 100 # mat4의 모은 원소에 100을 더한후, 이를 mat4로 저장
mat4
## [,1] [,2] [,3]
## [1,] 101 116 149
## [2,] 104 125 164
## [3,] 109 136 181
mat4 = cbind( mat4[ , -3 ] , 0 ) # 3번째 열을 0으로 치환
mat4
## [,1] [,2] [,3]
## [1,] 101 116 0
## [2,] 104 125 0
## [3,] 109 136 0
Matrix에 함수 적용
( mat2 = matrix( rnorm( 9 ) , ncol = 3 ) )
## [,1] [,2] [,3]
## [1,] -0.9680266 -1.6916466 1.14319412
## [2,] 0.4209175 -0.1571688 -0.06316815
## [3,] -2.0878713 0.6926289 1.92924795
round( mat2 , 2 )
## [,1] [,2] [,3]
## [1,] -0.97 -1.69 1.14
## [2,] 0.42 -0.16 -0.06
## [3,] -2.09 0.69 1.93
sum( mat2 )
## [1] -0.781893
mean( mat2 )
## [1] -0.086877
cos( mat2[ 1:2 , ] )
## [,1] [,2] [,3]
## [1,] 0.5669263 -0.1205563 0.4146901
## [2,] 0.9127145 0.9876744 0.9980056
( mat1 = matrix( 1:4 , ncol = 2 ) )
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
is.matrix( mat1 )
## [1] TRUE
is.vector( mat1 )
## [1] FALSE
( vec1 = as.vector( mat1 ) ) # matrix를 vector로 변환
## [1] 1 2 3 4
is.matrix( vec1 )
## [1] FALSE
as.matrix( vec1 ) # vector를 (벡터의 길이)x1 크기의 행렬로 변환
```R
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
```R
is.matrix( as.matrix( vec1 ) )
## [1] TRUE
dim( as.matrix( vec1 ) )
## [1] 4 1
( vec2 = c( mat1[ , 1 ] , mat1[ , 2 ] ) )
## [1] 1 2 3 4
apply() 함수
std1 = function(x) sqrt( var( x ) ) # 사용자정의 함수(user-defined function) : 표준편차(standard deviation) 계산
std1( 1:5 )
## [1] 1.581139
apply( school.store , 1 , std1 )
## drink ramen stationery
## 60.35893 68.70226 20.73644