LU분해에 알아보려고 하는데 그전에 알아야 하는 개념인 기본행렬과 치환행렬에 대해 공부했다.
기본 행렬(Elementary Matrix)
기본 행 연산을 표현하는 행렬이다.
각 기본 행렬은 하나의 행 연산과 대응된다.
기본 행렬의 종류
행 연산에는 세 가지 유형이 있고, 이에 따라 기본 행렬도 세 가지 유형으로 분류된다.
- 행 교환(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}$$
- 스칼라 곱(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}$$
- 행 덧셈(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}$$
이 행렬을 행렬의 왼쪽에서 곱하느냐, 오른쪽에서 곱하느냐에 따라 행을 교환할지, 열을 교환할지가 달라진다.
- 왼쪽에서 곱할 때: $P \cdot A$의 경우
$P \cdot A$의 경우, 행렬 $A$의 행을 교환한다. - 오른쪽에서 곱할 때: $A \cdot P$의 경우
$A \cdot P$의 경우, 행렬 $A$의 열을 교환한다.
치환 행렬의 성질
- 항상 정방행렬이다.
- 치환행렬은 직교행렬이다.
- 치환행렬은 정방행렬이다.
- 치환행렬의 각 행, 열의 크기는 1이다.
- 마지막으로 각 행과 열이 서로 직교한다. 그러므로 치환행렬의 역행렬은 치환행렬의 전치행렬이다.
$$P^{-1}=P^T$$ - 따라서 치환행렬은 직교행렬이다.
직교행렬의 가장 중요한 성질로 역행렬이 행렬의 전치행렬과 같다는 점이다.
코드
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]]'Linear Algebra > 개발자를 위한 실전 선형대수학' 카테고리의 다른 글
| [파이썬과 선형대수] 일반선형모델(General Linear Model)과 최소제곱해(Least Square Problem) (1) | 2024.11.30 |
|---|---|
| [파이썬과 선형대수] LU분해 그리고 직접 구현해보기 (1) | 2024.11.24 |
| [파이썬과 선형대수] 직교 행렬과 QR분해 개념, 직접 구현해보기 (0) | 2024.11.16 |
| [파이썬과 선형대수] 직교 투영법과 그람-슈미트 과정, 직접 구현해보기 (2) | 2024.11.12 |
| [파이썬과 선형대수] 역행렬(2) (단방향 역행렬, 의사역행렬) (2) | 2024.11.11 |