728x90
반응형

 

행렬(Matrix)

 수학에서 행렬은 1개 이상의 수 또는 다항식 등을 사각형 모양으로 배열한 것이다. 가로 줄은 행(Row), 세로 줄은 열(Column)이라 부른다.

 아서 케일리와 윌리엄 로원 해밀턴이 발명했으며, 행렬식의 값에 따라 연립방정식의 해가 다르게 나오는 것을 보고, 연립 방정식의 계수와 변수를 분리하여 사용하게 되면서 행렬이 등장하게 되었다.

 

 

 

1. 행렬의 정의

  • $m * n$ 행렬은 각 행 $i \in \{1,...,m\}$ 및 열 $j \in \{1,...,n\}$의 순서쌍 $(i, j)$에 대하여, 원소 $A_{ij} \in R$을 대응시키는 함수 $A = (A_{ij})_{ij}$이다.
  • 행렬 $A$는 모든 성분을 사각형으로 배열하고 소괄호 또는 대괄호를 추가하여 다음과 같이 표기한다.

$$ A = \begin{bmatrix}
 A_{11}& A_{12} & A_{13}  & ... & A_{1n}\\ 
 A_{21}& A_{22} & A_{23}  & ... & A_{2n}\\ 
 A_{31}& A_{32} & A_{33}  & ... & A_{3n}\\ 
 \vdots & \vdots & \vdots & \ddots & \vdots\\
 A_{m1}& A_{m2} & A_{m3}  & ... & A_{mn}\\
\end{bmatrix} $$

 

$$ A = \begin{pmatrix}
 A_{11}& A_{12} & A_{13}  & ... & A_{1n}\\ 
 A_{21}& A_{22} & A_{23}  & ... & A_{2n}\\ 
 A_{31}& A_{32} & A_{33}  & ... & A_{3n}\\ 
 \vdots & \vdots & \vdots & \ddots & \vdots\\
 A_{m1}& A_{m2} & A_{m3}  & ... & A_{mn}\\
\end{pmatrix} $$

  • $A_{ij}$를 $A$의 $i$번째 행 $j$번째 열의 성분(Entry) 또는 원소(Element) 또는 계수(Coefficient)라 한다.
  • 행렬 $A$의 각 성분은 행과 열의 번째 수를 첨수로 사용해, $A_{ij},\ A_{i,j},\ a_{ij},\ a_{i,j},\ A(i,j),\ A[i,j]$ 등과 같이 표현한다.
  • 행렬은 실수에 대해 닫혀 있으며, 행렬 연산 시 실수가 나온다.
  • 행과 열의 번째수가 동일한 성분 $A_{ii}\ (i \in \{1, ..., min\{m,n\}\})$을 $A$의 대각 성분(Diagonal entry) 또는 대각 원소(Diagonal element), 대각 요소, 주대각 성분이라고 한다.

 

  • 행렬 $A$의 크기(Size)는 행과 열의 수의 순서쌍 $(m,n)$ 또는 $m*n$으로 나타낸다.
  • 만약 행과 열의 수가 같다면($m=n$) 행렬$A$를 정사각 행렬(Square matrix) 또는 정방 행렬이라 부른다.
  • 행과 열의 수가 다르다면($m \neq n$) 직사각 행렬(Rectangular matrix) 또는 장방 행렬이라 부르는데, 일반적으로 행렬은 직사각형이므로, 정방 행렬과 구분하고자 하는 경우가 아니라면 그냥 행렬이라 부른다.

 

  • 만약, $m=1$이라면 행렬 $A$를 $1*n$ 행 백터(Row vector)라고 한다.
  • 만약, $n=1$이라면 행렬 $A$를 $m*1$ 열 벡터(Column vector)라고 한다.
  • 만약, $m=1,\ n=1$인 행렬 $A$는 스칼라(Scalar)라고 한다.

$$X = \begin{bmatrix} x_1 & x_2 & x_3 & ... &x_n \end{bmatrix}$$

$$X = \begin{bmatrix}
x_1\\ 
x_2\\ 
x_3\\ 
\vdots \\
x_n
\end{bmatrix}$$

$$X = \begin{bmatrix} x_1 \end{bmatrix}$$

  • 즉, 벡터와 스칼라 역시 수학적으로는 행렬에 속한다.

 

 

 

 

2. Python과 다양한 형태의 행렬

  • Python에서는 Numpy 라이브러리를 사용해서 행렬, 벡터를 만든다.
  • Python의 Numpy라이브러리를 사용해서 다양한 형태의 행렬을 만들어보도록 하겠다.
import numpy as np

2.1. 직사각 행렬(Rectangular matrix)

>>> np.arange(0, 18).reshape((3,6))
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17]])
       
       
# 랜덤한 값으로 만들수도 있다.
>>> np.random.randint(0, 20, size=(3, 6))
array([[16,  9,  1,  6,  7, 18],
       [ 4, 15, 15, 16, 13, 16],
       [ 8,  1,  2,  8, 11,  8]])
  • 직사각형 모양의 행렬로, 장방 행렬이라고도 부르며, 가장 일반적인 행렬이다.

2.2. 정사각 행렬(Square matrix)

>>> np.arange(0, 16).reshape((4,4))
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
       
       
>>> np.random.randint(0, 20, size=(3, 3))
array([[ 5,  8,  7],
       [13,  9,  0],
       [ 8, 17,  8]])
  • 정사각형 모양의 행렬로, 정방 행렬이라고도 부른다.

2.3. 영행렬(Zero matrix)

>>> np.zeros((4, 5))
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
  • 모든 원소가 0인 행렬로, 행렬 곱에서 영원으로 작용하는 행렬이다.

2.4. 항등행렬(Identity matrix)

>>> np.identity(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
  • 대각 성분은 모두 1이며, 나머지 원소는 0인 행렬이다.
  • 행렬 곱셈에서 항등원으로 작용하며, 다른 행렬에 곱하면, 곱한 행렬이 그대로 나오게 된다.
  • 단위행렬이라고도 부른다.

2.5. 대각행렬(Diagonal matrix)

# 대각행렬 만들기
>>> diag_M = np.diag((4, 2, 2, 5, 1, 6))
>>> diag_M
array([[4, 0, 0, 0, 0, 0],
       [0, 2, 0, 0, 0, 0],
       [0, 0, 2, 0, 0, 0],
       [0, 0, 0, 5, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 6]])

# 대각성분 뽑기
>>> np.diagonal(diag_M)
array([4, 2, 2, 5, 1, 6])

# 대각성분이 1인 행렬 만들기
>>> np.eye(3, 3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
       
# 장방행렬로 만들기
>>> np.eye(5, 3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 0.],
       [0., 0., 0.]])
  • 대각행렬은 주대각선 원소를 제외한 모든 원소가 0인 정방행렬이다.
  • 영행렬, 단위 행렬은 대각 행렬에 포함된다.
  • 장방행렬 역시 주대각 성분을 제외한 나머지 원소가 0인 경우 대각행렬에 포함된다.

2.6. 스칼라 행렬(Scalar matrix) 

# 대각 성분이 모두 1인 대각행렬
>>> np.identity(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])
       
# 대각 성분이 모두 같은 대각행렬
>>> np.diag(np.full(4, 5))
array([[5, 0, 0, 0],
       [0, 5, 0, 0],
       [0, 0, 5, 0],
       [0, 0, 0, 5]])
  • 주대각 성분이 모두 같은 원소로 된 대각행렬

2.7. 삼각행렬(Triangular matrix)

# 정방행렬
>>> Mat = np.arange(0, 36).reshape((6,6))
>>> Mat
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])
       
# 상삼각행렬
>>> np.triu(Mat, 0)
array([[ 0,  1,  2,  3,  4,  5],
       [ 0,  7,  8,  9, 10, 11],
       [ 0,  0, 14, 15, 16, 17],
       [ 0,  0,  0, 21, 22, 23],
       [ 0,  0,  0,  0, 28, 29],
       [ 0,  0,  0,  0,  0, 35]])
       
# 하삼각행렬
>>> np.tril(Mat, 0)
array([[ 0,  0,  0,  0,  0,  0],
       [ 6,  7,  0,  0,  0,  0],
       [12, 13, 14,  0,  0,  0],
       [18, 19, 20, 21,  0,  0],
       [24, 25, 26, 27, 28,  0],
       [30, 31, 32, 33, 34, 35]])
  • 정방행렬의 특수한 경우로, 주대각선을 기준으로 대각항의 위쪽이나 아래쪽 항들의 값이 모두 0인 경우를 의미한다.
  • 주대각선 성분을 기준으로 아래가 모두 0이면 상삼각행렬(Upper Triangular matrix)이다.
  • 주대각선 성분을 기준으로 위가 모두 0이면 하삼각행렬(Lower Triangular matrix)이다.

2.8. 전치행렬(Transpose Matrix)

>>> Mat = np.arange(0, 16).reshape((4,4))
>>> Mat
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
       
# 전치행렬 만들기
>>> Mat.T
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])
       
>>> np.transpose(Mat)
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])
  • 행렬 $A$의 전치행렬은 $A^T$로 표기한다.
  • 주대각 성분을 기준으로 행과 열을 대칭으로 바꾼 행렬
  • 주대각 성분을 기준으로 하므로, 주대각 성분은 변하지 않는다.
  • 정사각행렬 $A$가 $A^T=A$를 만족하면 행렬 $A$는 대칭행렬이다.
    (전치행렬인 $A^T$는 주대각 성분을 기준으로 행과 열을 대칭으로 바꾸기 때문이다.)
  • 반대로, $A^T=-A$를 만족하면 반대칭행렬(Skew symmetric matrix) 또는 교대행렬(Alternating matrix)이라 한다.

2.9. 직교행렬(Orthogonal matrix)

>>> Ort_M = np.array([[0,0,1],[1,0,0],[0,1,0]])
>>> Ort_M
array([[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]])
       
# 행렬 Ort_M과 전치행렬 Ort_M을 행렬곱하였을 때, 단위 행렬이 나오는 행렬 Ort_M
>>> np.dot(Ort_M, Ort_M.T)
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])
  • 행렬 A의 역행렬이 A의 전치행렬인 행렬 A를 직교행렬이라 한다.
  • 직교행렬과 직교행렬의 전치행렬을 행렬곱하면 단위행렬이 나온다.
  • $A^{-1} = A^T, \ A^TA = I$
728x90
반응형

+ Recent posts