7.7 행렬의 연산 함수

7.7.1 행렬의 연산

행렬 xy가 다음과 같이 있을 때 일반적인 산술연산자의 경우는 행렬의 요소별로 연산이 이루어 집니다.

# 두 개의 예제 행렬을 만듭니다. 두 행렬의 행과 열의 갯수가 같습니다
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,]    2    5    7
## [2,]    1    7    5
x - y
##      [,1] [,2] [,3]
## [1,]    0    1    3
## [2,]    3    1    7
x * y
##      [,1] [,2] [,3]
## [1,]    1    6   10
## [2,]   -2   12   -6
x / y
##      [,1]     [,2] [,3]
## [1,]    1 1.500000  2.5
## [2,]   -2 1.333333 -6.0
x %% y
##      [,1] [,2] [,3]
## [1,]    0    1    1
## [2,]    0    1    0
x %/% y
##      [,1] [,2] [,3]
## [1,]    1    1    2
## [2,]   -2    1   -6
# sum(), mean() 함수 등
sum(x)                 # 모든 요소의 합을 반환합니다.
## [1] 21
mean(x)                # 모든 요소의 평균을 반환합니다.
## [1] 3.5
rowSums(x)             # 행별로 합계를 반환합니다.
## [1]  9 12
colSums(x)             # 열별로 합계를 반환합니다.
## [1]  3  7 11
apply(x, 1, sum)       # 행별로 합계를 반환합니다.
## [1]  9 12
apply(x, 2, sum)       # 열별로 합계를 반환합니다.
## [1]  3  7 11
proportions(x)         # 각 요소의 비율을 반한홥니다.
##            [,1]      [,2]      [,3]
## [1,] 0.04761905 0.1428571 0.2380952
## [2,] 0.09523810 0.1904762 0.2857143

위에서 apply() 함수의 사용에 대하여 간단히 살펴보겠습니다.

apply(x, MARGIN, FUN, …)

인수 :

  • x : 함수를 적용할 행렬을 포함한 배열 데이터입니다.

  • MARGIN = : 1이면 행단위, 2이면 열단위로 FUN을 적용합니다.

  • FUN : 적용할 함수 (sum, mena, sd, median, … 사용자 정의 함수도 가능)

apply() 함수의 사용에 대한 간단한 예를 살펴 보겠습니다.

x <- matrix(c(2,4,6,8,10,12), nrow = 2)

# MARGIN = 1 : 행단위의 연산을 합니다.
apply(x, MARGIN = 1, FUN = sum)      # 행렬 x를 행 단위로(MARTGIN = 1) 합계(sum)를 반환합니다.
## [1] 18 24
apply(x, 1, mean)                    # MARGIN =와 FUN = 는 생략가능합니다. 행 단위의 평균을 반환합니다.
## [1] 6 8
apply(x, 1, sd)                      # 행 단위의 표준편차를 반환합니다.
## [1] 4 4
# MARGIN = 2 : 열단위의 연산을 합니다.
apply(x, MARGIN = 2, FUN = sum)
## [1]  6 14 22
apply(x, 2, mean)
## [1]  3  7 11
apply(x, 2, sd)
## [1] 1.414214 1.414214 1.414214

7.7.2 행렬 곱하기

행렬 X와 행렬 Y가 있고, 행렬 X의 열의 갯수행렬 Y의 행의 갯수가 같을 때 행렬 X와 행렬 Y를 곱할 수 있습니다. 이를 행렬 X와 행렬 Y의 곱하기라고 %*% 연산자를 이용하여 구합니다.

a <- matrix(c(2, 1, 0, 1, 2, 1, 0, 1, 2), ncol = 3); a
##      [,1] [,2] [,3]
## [1,]    2    1    0
## [2,]    1    2    1
## [3,]    0    1    2
p <- matrix(c(1, 0, 0, 0, 0, 1, 0, 1, 0), ncol = 3); p
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    0    1
## [3,]    0    1    0
p %*% a       #  p의 열의 갯수와 a의 행의 갯수가 같아야 함.
##      [,1] [,2] [,3]
## [1,]    2    1    0
## [2,]    0    1    2
## [3,]    1    2    1

7.7.3 전치행렬 구하기

행렬의 일반적인 연산은 행과 열의 위치를 바꾸는 것입니다. 이렇게 A 행렬에 대해 행과 열이 바뀐 행렬 B가 있다면 B행렬을 A행렬의 전치행렬(transpose matrix) 이라고 합니다. 전치행렬을 t() 함수를 이용하여 구합니다.

mat
##       col.1 col.2 col.3 col.4
## row.1     1     5     3     6
## row.2     3     6     4     8
## row.3     2     4     8     7
t.mat <- t(mat); t.mat              # t.mat을 mat의 전치행렬이라고 합니다.
##       row.1 row.2 row.3
## col.1     1     3     2
## col.2     5     6     4
## col.3     3     4     8
## col.4     6     8     7
z <- t(x)%*%y ; z
##      [,1] [,2] [,3]
## [1,]   -2   16    0
## [2,]   -2   36    4
## [3,]   -2   56    8

7.7.4 역행렬

An×n 행렬일 때, 아래를 만족하는 n×n 행렬 B가 존재하면, B를 A의 역행렬(inverse matrix)이라고 하고, \[ A^{-1} \] 로 표시함.

\[ A \star\% B = B \star A = I -> (Identity matrix) \] 이러한 역행렬은 solve() 함수로 구합니다.

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

7.7.5 행렬식(determinant)

행렬식(determinant)은 딱히 정의(definition)가 없습니다. 그냥 어떤 특별한 계산식에 따라 행렬의 원소들을 대입하여 얻은 결과값(수치)을 지칭합니다 (즉, 행렬에 대해 계산되는 하나의 숫자값이다). 다만 그 결과값이 그 행렬의 특성을 결정짓는 중요한 값이기에 determinant라 부릅니다. 행렬식(determinant)은 또한 역행렬과 마찬가지로 정방행렬(행과 열의 개수가 같은 행렬)에 대해서만 정의된다..9

이러한 행렬의 행렬식은 det() 함수를 이용하여 구할 수 있습니다.

a <- matrix(c(1,2,3,4,5,6,7,8,9), c(3,3)) 
det(a)
## [1] 0
b <- matrix(c(0,1,2,3,4,5,6,7,9), c(3,3)) 
det(b)
## [1] -3

7.7.6 대각행렬 만들기

행렬의 (주)대각선 요소를 제외한 나머지 요소가 모두 0인 행렬을 대각행렬(diagonal matrix)이라고 합니다. 이러한 대각행렬은 diag() 함수를 이용하여 만들 수 있습니다.

i.mat <- diag(1, 5)               # 주대각선이 모두 1인 행렬을 항등행렬(Identity Matrix)이라고 합니다.
i.mat
##      [,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
dia.mat1 <- diag(5)               # diag(1, 5)와 같습니다.
dia.mat1
##      [,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
dia.mat2 <- diag(1:10)            # 주대각선의 요소가 1:10인 대각행렬을 만듭니다.
dia.mat2
##       [,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
(x5 <- diag(seq(1, 10, 2)))       # 주대각선의 요소가 (1 3 5 7 9)인 대각행렬을 만듭니다.
##      [,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

추가적인 행렬 연산에 대하여 R에서 하는 벡터/행렬 연산을 참고하기 바랍니다.