7.7 행렬의 연산 함수
7.7.1 행렬의 연산
행렬 x
와y
가 다음과 같이 있을 때 일반적인 산술연산자의 경우는 행렬의 요소별로 연산이 이루어 집니다.
# 두 개의 예제 행렬을 만듭니다. 두 행렬의 행과 열의 갯수가 같습니다
<- matrix(c(1:6), ncol = 3); x x
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
<- matrix(c(1, -1, 2, 3, 2, -1), ncol = 3); y y
## [,1] [,2] [,3]
## [1,] 1 2 2
## [2,] -1 3 -1
# 산술연산자를 이용한 연산의 경우 요소별로 연산이 됩니다.
+ y x
## [,1] [,2] [,3]
## [1,] 2 5 7
## [2,] 1 7 5
- y x
## [,1] [,2] [,3]
## [1,] 0 1 3
## [2,] 3 1 7
* y x
## [,1] [,2] [,3]
## [1,] 1 6 10
## [2,] -2 12 -6
/ y x
## [,1] [,2] [,3]
## [1,] 1 1.500000 2.5
## [2,] -2 1.333333 -6.0
%% y x
## [,1] [,2] [,3]
## [1,] 0 1 1
## [2,] 0 1 0
%/% y x
## [,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()
함수의 사용에 대한 간단한 예를 살펴 보겠습니다.
<- matrix(c(2,4,6,8,10,12), nrow = 2)
x
# 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
의 곱하기라고 %*%
연산자를 이용하여 구합니다.
<- matrix(c(2, 1, 0, 1, 2, 1, 0, 1, 2), ncol = 3); a a
## [,1] [,2] [,3]
## [1,] 2 1 0
## [2,] 1 2 1
## [3,] 0 1 2
<- matrix(c(1, 0, 0, 0, 0, 1, 0, 1, 0), ncol = 3); p p
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 0 1
## [3,] 0 1 0
%*% a # p의 열의 갯수와 a의 행의 갯수가 같아야 함. p
## [,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을 mat의 전치행렬이라고 합니다. t.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
<- t(x)%*%y ; z z
## [,1] [,2] [,3]
## [1,] -2 16 0
## [2,] -2 36 4
## [3,] -2 56 8
7.7.4 역행렬
A
가n×n
행렬일 때, 아래를 만족하는 n×n 행렬 B가 존재하면, B를 A의 역행렬(inverse matrix)이라고 하고,
\[
A^{-1}
\]
로 표시함.
\[
A \star\% B = B \star A = I -> (Identity matrix)
\]
이러한 역행렬은 solve()
함수로 구합니다.
<- matrix(c(1, 2, 3, 3, 0, 1, 5, 4, 2), ncol = 3); a 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()
함수를 이용하여 구할 수 있습니다.
<- matrix(c(1,2,3,4,5,6,7,8,9), c(3,3))
a det(a)
## [1] 0
<- matrix(c(0,1,2,3,4,5,6,7,9), c(3,3))
b det(b)
## [1] -3
7.7.6 대각행렬 만들기
행렬의 (주)대각선 요소를 제외한 나머지 요소가 모두 0
인 행렬을 대각행렬(diagonal matrix)이라고 합니다. 이러한 대각행렬은 diag()
함수를 이용하여 만들 수 있습니다.
<- diag(1, 5) # 주대각선이 모두 1인 행렬을 항등행렬(Identity Matrix)이라고 합니다.
i.mat 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
<- diag(5) # diag(1, 5)와 같습니다.
dia.mat1 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
<- diag(1:10) # 주대각선의 요소가 1:10인 대각행렬을 만듭니다.
dia.mat2 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
<- diag(seq(1, 10, 2))) # 주대각선의 요소가 (1 3 5 7 9)인 대각행렬을 만듭니다. (x5
## [,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에서 하는 벡터/행렬 연산을 참고하기 바랍니다.