행렬의 기본 연산에 대해서 알아봅시다.
행렬의 덧셈 (Matrix Addition) 과 행렬의 곱셈 (Matrix Multiplication)은 행렬 A,B,C, 그리고 상수 c에 대해 다음 식들을 만족합니다.
Addition 행렬의 덧셈
행렬 $A = \begin{bmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{bmatrix}$와 행렬 $B = \begin{bmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{bmatrix}$에서 A + B는
$A + B = \begin{bmatrix} a_{11}+b_{11} & a_{12}+b_{12} \\ a_{21}+b_{21} & a_{22}+b_{22} \end{bmatrix}$
각 항이 늘어나도 위의 식처럼 같은 위치의 항끼리 더해주면 됩니다.
덧셈 특징
- $A + B= B + A$ : 행렬의 덧셈에서의 교환법칙은 성립합니다.
- $(A+B)+ C=A+(B+C)$ : 덧셈 순서는 중요하지 않습니다.
- $c(A+B)=cA+cB$ : 상수 c에 대한 분배법칙도 성립합니다.
- $(c+d)A=cA+dA$ : 반대로 행렬 A에 대한 분배법칙도 성립합니다.
- $c(dA)=(cd)A$ : 상수와 행렬의 곱에서 순서는 중요하지 않습니다.
- $A+{0}=A$ : 행렬 A에 0행렬을 더하면 자기자신입니다.
- 어떤 행렬 $A$든 $- A$ 행렬은 존재합니다. 예를 들면 $ A+(- A)=0$.
(※ 0행렬은 모든 원소가 0인 행렬입니다.)
Multiplication 행렬의 곱셈
행렬 A X B를 C라고 할 때, 행렬 C는 다음과 같습니다.
곱셈 특징
- $ A({BC})=({AB}) C$ : 행렬끼리 곱할 때, 곱하는 순서는 중요하지 않습니다.
- $c({AB})=(cA)B=A(cB)$ : 상수 또한 마찬가지입니다.
- $A(B+ C)={AB}+{AC}$ : 행렬의 곱에서는 결합법칙이 성립합니다.
- $(B+C)A={BA}+{CA}$
단 $ AB \neq $ BA $ 행렬의 곱에서 교환 법칙은 성립하지 않습니다.
곱셈의 경우에는 각 원소끼리 곱하는 Elementwise Multiplication와 행렬 간의 곱 Matrix Multiplication이 있는데, 양쪽 다 많이 쓰이는 만큼 잘 구분해야 합니다.
$ AB \neq $ BA $에 대해서 자세히 알아봅시다.
import sympy as sy
A = sy.Matrix([[3, 4], [7, 8]])
B = sy.Matrix([[5, 3], [2, 1]])
# 파이썬에서 행렬의 곱셈 연산자는 @입니다.
A@B
B@A
하지만 백터 곱셈 Vector Multiplication은 교환법칙이 성립합니다($x^Ty = y^Tx$).
T는 Matrix Transpose (전치행렬) 연산입니다.
T 연산은 행렬의 주 대각선을 축으로 반사하여 줍니다.
Matrix transpose는 Matrix $A,B$, 그리고 constant $c$에 대해 다음 식들을 만족합니다.
- $(A^T)^T = A$ : A를 transpose 하고 또 transpose하면 본래 자신이 됩니다.
- $(A+B)^T=A^T+B^T$ : A + B의 transpose는 A에 transpose하고 B에 transpose한 뒤 합과 같은 결과가 나옵니다.
- $(cA)^T=cA^T$ : 상수의 transpose는 자기 자신입니다. (주의! 백터는 아닙니다.)
- $(AB)^T=B^TA^T$ 행렬 A곱하기 B의 transpose는 B transpose곱하기 A transpose입니다.
$(AB)^T=B^TA^T$이 성립하는지 알아봅시다.
a, b, c, d, e, f, g, h, i, j, k, l = sy.symbols('a, b, c, d, e, f, g, h, i, j, k, l', real = True)
A = sy.Matrix([[a, b], [c, d], [e, f]])
B = sy.Matrix([[g, h, i], [j, k, l]])
AB = A@B
AB_tr = AB.transpose()
AB_tr # 좌항
B_tr_A_tr = B.transpose()@A.transpose()
B_tr_A_tr # 우항
파이썬으로 코딩한 결과 동일한 행렬을 얻는 다는 것을 알 수 있습니다.