지난번 포스팅에서는 행렬의 뜻, 형태, 표기법, R로 입력하는 방법에 대해서 소개하였습니다.
이번 포스팅에서는 특수한 형태의 행렬, 제로행렬(zero matrix), 전치행렬 (transpose matrix), 대칭행렬 (symmetric matrix), 상삼각행렬 (upper triangular matrix), 하삼각행렬 (lower triangular matrix), 대각행렬 (diagonal matrix), 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U)의 7가지에 대하여 차례대로 알아보겠습니다.
아래에 소개하는 행렬 형태와 표기법도 잘 기억해두시면 나중에 유용할 거예요. 특히 전치행렬, 대각행렬, 단위행렬, 역행렬은 자주 사용하는 편이니 잘 기억해두면 좋겠습니다.
(1) 제로행렬 (zero matrix or null matrix)
모든 성분이 '0'인 행렬을 제로행렬, 또는 영행렬이라고 합니다.
> # zero matrix
> A_zero <- matrix(c(0, 0, 0, 0, 0, 0, 0, 0, 0), byrow = TRUE, nrow = 3)
> A_zero
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
>
> B_zero <- matrix(rep(0, 9), byrow = TRUE, nrow = 3)
> B_zero
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
|
(2) 전치행렬 (transpose matrix)
행이 m개, 열이 n개인 m * n 행렬 (m by n matrix) 의 행과 열을 서로 바꾼 n * m 행렬 (n by m matrix)를 전치행렬이라고 합니다. 아래에 동그라미로 표시한 행렬의 성분들이 전치를 했을 때 서로 어디로 위치가 바뀌었는지를 유심히 살펴보시기 바랍니다.
전치행렬은 행렬 우측 상단에 대문자 'T'를 표기합니다. 아래 표기 예시를 참조하세요.
> # transpose matrix
> A <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), byrow = TRUE, nrow = 3)
> A
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
>
> A_t <- t(A)
> A_t
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
>
> B <- matrix(c(4, 5, 6, 7, 8, 9), nc=3)
> B
[,1] [,2] [,3]
[1,] 4 6 8
[2,] 5 7 9
>
> B_t <- t(B)
> B_t
[,1] [,2]
[1,] 4 5
[2,] 6 7
[3,] 8 9
|
(3) 대칭행렬 (symmetric matrix)
대칭행렬이란 대각성분을 중심으로 대칭인 n차정방행렬로서, 원래 행렬과 전치행렬이 동일한 경우를 의미합니다. (* wikipedia : a symmetric matrix is a square matrix that is equal to its transpose)
> # symmetric matrix
> s <- matrix(c(1:25), 5)
> s
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
>
> lower.tri(s, diag=FALSE)
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE FALSE
[5,] TRUE TRUE TRUE TRUE FALSE
> s[lower.tri(s, diag=FALSE)]
[1] 2 3 4 5 8 9 10 14 15 20
> t(s)[lower.tri(s, diag=FALSE)]
[1] 6 11 16 21 12 17 22 18 23 24
>
> s[lower.tri(s, diag=FALSE)] = t(s)[lower.tri(s, diag=FALSE)]
> s
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 6 7 12 17 22
[3,] 11 12 13 18 23
[4,] 16 17 18 19 24
[5,] 21 22 23 24 25
|
(4) 상삼각행렬 (upper triangular matrix)
상삼각행렬은 대각성분 아래의 성분이 모두 '0'인 n차정방행렬입니다. 아래의 색깔 칠해놓은 행렬 예를 보면 금방 이해할 수 있을 거예요.
R의 base패키지 내 lower.tri(x, diag=FALSE) 함수를 이용하여 상삼각행렬(upper triangular matrix)를 아래에 만들어보았습니다.
> # upper triangular matrix
> (m_upper <- matrix(1:20, 4, 4))
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
>
> lower.tri(m_upper, diag=FALSE)
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
> m_upper[lower.tri(m_upper, diag=FALSE)] <- c(0)
> m_upper
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 0 6 10 14
[3,] 0 0 11 15
[4,] 0 0 0 16
|
(5) 하삼각행렬 (lower triangular matrix)
하삼각행렬은 대각성분 위의 성분이 모두 '0'인 n차정방행렬로서, 상삼각행렬과 '0'이 있는 위치가 대각선으로 반대임을 알 수 있습니다.
R의 base패키지 내 upper.tri(x, diag=FALSE) 함수를 이용하여 하삼각행렬(lower triangular matrix)를 아래에 만들어보았습니다.
> # lower triangular matrix
> (m_lower <- matrix(1:20, 4, 4))
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
>
> upper.tri(m_lower, diag=FALSE)
[,1] [,2] [,3] [,4]
[1,] FALSE TRUE TRUE TRUE
[2,] FALSE FALSE TRUE TRUE
[3,] FALSE FALSE FALSE TRUE
[4,] FALSE FALSE FALSE FALSE
> m_lower[upper.tri(m_lower, diag=FALSE)] <- c(0)
> m_lower
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 2 6 0 0
[3,] 3 7 11 0
[4,] 4 8 12 16
|
(6) 대각행렬 (diagonal matrix)
대각행렬은 대각성분 이외의 모든 성분이 모두 '0'인 n차정방행렬을 말하며, 아래 예의 대각행렬의 경우 대각성분만을 따다가 diag(1, 2, 3, 4)로 표기합니다.
(* wikipedia : a diagonal matrix is a matrix (usually a square matrix) in which the entries outside the main diagonal (↘) are all zero. The diagonal entries themselves may or may not be zero.)
위에서 소개했던 제로행렬(zero matrix)과 바로 아래에 소개할 단위행렬(unit matrix) 또는 항등행렬(identity matrix)도 대각행렬(diagonal matrix)에 속한다고 할 수 있겠습니다.
그리고 대각행렬은 상삼각행렬(upper triangular matrix) 또는 하삼각행렬(lower triangular matrix)에 속한다고도 할 수 있겠습니다.
R의 diag(A) 함수를 사용해서 위의 diag(1, 2, 3, 4) 대각행렬을 만들어보겠습니다.
> # diagonal matrix
> A <- c(1, 2, 3, 4)
> diag(A)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 2 0 0
[3,] 0 0 3 0
[4,] 0 0 0 4 |
대각행렬의 곱셉, P승은 아래와 같이 각 성분의 P승이 되는 재미있는, 유용한 특성을 가지고 있습니다.
(7) 항등행렬 또는 단위행렬 (identity matrix, I, or unit matrix, U)
항등행렬 또는 단위행렬은 대각성분이 모두 '1'이고 그 이외의 모든 성분은 '0'인 n차정방행렬을 말하며, identity matrix 의 첫 대문자를 따서 'I' 로 표기하거나 unit matrix의 첫 대문자를 따서 'U'로 표기합니다. (일부 수학책에서는 독일어 Einheits matrix의 첫 대문자를 따서 'E'로 표기하기도 함)
(* wikipedia : the identity matrix or unit matrix of size n is the n × n square matrix with ones on the main diagonal and zeros elsewhere)
항등행렬 또는 단위행렬 In을 행렬 Amn 에 곱하면 그대로 Amn이 됩니다. 어떤 수에 '1'을 곱하면 그대로 원래의 수가 되기 때문입니다.
R의 diag(k) 함수로 k by 항등행렬 또는 단위행렬을 만들 수 있습니다.
> # identity matrix or unit matrix : diag(k)
> diag(4)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1
> > diag(6)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 0 0 0 0 0
[2,] 0 1 0 0 0 0
[3,] 0 0 1 0 0 0
[4,] 0 0 0 1 0 0
[5,] 0 0 0 0 1 0
[6,] 0 0 0 0 0 1
|
항등행렬 또는 단위행렬의 역행렬(inverse matrix, 바로 아래에 설명)은 단위행렬입니다. 단위행렬과 역행렬은 매우 중요한 행렬이므로 꼭 잘 이해를 해두시는게 좋습니다.
다음번 포스팅에서는 역행렬(the inverse of a matrix, invertible matrix)에 대해서 소개하겠습니다.
많은 도움이 되었기를 바랍니다.
행렬, 벡터 관련 이전 포스팅은 아래 링크를 걸어놓았습니다.
☞ 행렬 기본 이해
☞ 가우스 소거법을 활용한 역행렬 계산
☞ 여인수를 활용한 역행렬 계산
☞ 행렬의 기본 연산 (+, -, *, /, ^, %*%, colMeans(), rowMeans(), colSums(), rowSums())
☞ 벡터의 기본 이해와 연산 (vector: addition, subtraction, multiplication by scalar)
☞ 벡터의 곱 (1) 내적 (inner product, dot product, scalar product, projection product)
☞ 벡터의 곱 (2) 외적 (outer product, cross product, vector product, tensor product)
이번 포스팅이 도움이 되었다면 아래의 공감 ♡ 꾸욱~ 눌러주세요. ^^