Linear Algebra/개발자를 위한 실전 선형대수학

[파이썬과 선형대수] 기본행렬과 치환행렬

WooJi 2024. 11. 21. 20:01

LU분해에 알아보려고 하는데 그전에 알아야 하는 개념인 기본행렬과 치환행렬에 대해 공부했다.

기본 행렬(Elementary Matrix)

기본 행 연산을 표현하는 행렬이다.
각 기본 행렬은 하나의 행 연산과 대응된다.

기본 행렬의 종류

행 연산에는 세 가지 유형이 있고, 이에 따라 기본 행렬도 세 가지 유형으로 분류된다.

  1. 행 교환(Row Swapping):
    • 두 행을 교환하는 행 연산이다.
    • $R_i \leftrightarrow R_j$​
    • 대응하는 기본 행렬은 $i-$번째 행과 $j-$번째 행이 교환된 단위행렬이다.
    • $3 \times 3$ 단위행렬에서 $R_1 \leftrightarrow R_2$ (1행과 2행 교환):
    • $E$를 행렬 $A$에 곱하면, $A$의 1행과 2행이 교환된다.

$$E = \begin{bmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

  1. 스칼라 곱(Scaling):
    • 하나의 행에 상수를 곱하는 행 연산이다.
    • 예: $R_i \rightarrow c \cdot R_i,(c \neq 0)$
    • 대응하는 기본 행렬은 $i-$번째 대각 원소가 $c$로 변경된 단위행렬이다.
    • $R_2 \rightarrow 2 \cdot R_2$ (2행에 2를 곱함):
    • 이 $E$를 곱하면 $A$의 2행에 2를 곱한다.

$$E = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 2 & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

  1. 행 덧셈(Row Addition):
    • 한 행에 다른 행의 배수를 더하는 행 연산이다.
    • 예: $R_i \rightarrow R_i + c \cdot R_j,​ (i \neq j)$
    • 대응하는 기본 행렬은 $i,j-$행과 관련된 위치가 $c$로 설정된 단위행렬이다.
    • $R_3 \rightarrow R_3 + 3 \cdot R_1$ (3행에 1행의 3배를 더함):
    • 이 $E$를 곱하면 $A$의 3행이 변경된다.

$$E = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 3 & 0 & 1 \end{bmatrix}$$​​

기본 행렬의 성질

  • 행 연산 효과:
    • 행렬 $A$에 기본 행렬 $E$를 왼쪽에서 곱하면, $E \cdot A$는 $A$에 해당 행 연산을 적용한 결과가 된다.
  • 역행렬 존재:
    • 모든 기본 행렬은 역행렬이 존재하고, 그 역행렬은 원래의 행 연산을 되돌리는 연산을 수행하는 기본 행렬이다.

코드

import numpy as np


A=np.array([[1,1,1],
            [2,2,2],
            [3,3,3]])

#elementary matrix
#2행에 1행*2를 더해주는 기본행렬
E1=np.array([[1,0,0],
             [2,1,0],
             [0,0,1]])

#(3행*2)에 (1행*(-1))를 더해주는 기본행렬
E2=np.array([[1,0,0],
             [0,1,0],
             [-1,0,2]])

print(f'E1@A의 결과:\n{E1@A}')
print(f'E2@E1@A의 결과:\n{E2@E1@A}')

실행결과

E1@A의 결과:
[[1 1 1]
 [4 4 4]
 [3 3 3]]
E2@E1@A의 결과:
[[1 1 1]
 [4 4 4]
 [5 5 5]]

치환행렬(Permutation Matrix)

행 또는 열의 순서를 바꾸는 데 사용되는 정방 행렬이다.
행렬은 각 행이나 열에 1이 하나만 존재하고 나머지 요소는 0으로 구성된다. 위에서 다룬 행 교환 기본행렬이 치환행렬이다.

치환행렬의 역할

정의에서 치환행렬은 행렬의 행 또는 열의 순서를 바꾸는 데에 사용된다고 했다.

위에서 본 기본행렬을 다시 보자.
$$E = \begin{bmatrix} 0 & 1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix}$$
이 행렬을 행렬의 왼쪽에서 곱하느냐, 오른쪽에서 곱하느냐에 따라 행을 교환할지, 열을 교환할지가 달라진다.

  1. 왼쪽에서 곱할 때: $P \cdot A$의 경우
    $P \cdot A$의 경우, 행렬 $A$의 행을 교환한다.
  2. 오른쪽에서 곱할 때: $A \cdot P$의 경우
    $A \cdot P$의 경우, 행렬 $A$의 열을 교환한다.

치환 행렬의 성질

  1. 항상 정방행렬이다.
  2. 치환행렬은 직교행렬이다.
    1. 치환행렬은 정방행렬이다.
    2. 치환행렬의 각 행, 열의 크기는 1이다.
    3. 마지막으로 각 행과 열이 서로 직교한다. 그러므로 치환행렬의 역행렬은 치환행렬의 전치행렬이다.
      $$P^{-1}=P^T$$
    4. 따라서 치환행렬은 직교행렬이다.
      직교행렬의 가장 중요한 성질로 역행렬이 행렬의 전치행렬과 같다는 점이다.

코드

import numpy as np

A=np.array([[1,2,3],
            [4,5,6],
            [7,8,9]])

#치환행렬
P=np.array([[0,1,0],
            [1,0,0],
            [0,0,1]])


print(f'P를 왼쪽에 곱하면 행을 바꾼다.\n{P@A}')
print(f'P를 오른쪽에 곱하면 열을 바꾼다.\n{A@P}')

실행결과

P를 왼쪽에 곱하면 행을 바꾼다.
[[4 5 6]
 [1 2 3]
 [7 8 9]]
P를 오른쪽에 곱하면 열을 바꾼다.
[[2 1 3]
 [5 4 6]
 [8 7 9]]