행렬 연산
행렬의 기본연산은 같은 차원들 사이에서 이루어 집니다. 다음은 같은 차원의 두개 또는 세개 행렬들 사이에서 성립되는 관계를 나타낸 것입니다.
- A, B, C: 행렬, I: 항등행렬 I, r, s: 스칼라
- A + B = B + A
- (A + B) + C = A + (B + C)
- A + 0 = A
- r(A + B) = rA + rB
- (r + s)A = rA + sA
- r(sA) = (rs)A
- A(BC) = (AB)C
- A(B + C) = AB + AC
- (B + C)A = BA + CA
- r(AB) = (rA)B = A(rC)
- IA = AI = A
import numpy as np import scipy.linalg as LA from sympy import *
예 1)
행렬 A,B,C에서의 연산
$$A=\begin{bmatrix}4& 0& 5\\-1& 3& 2\end{bmatrix}\quad B=\begin{bmatrix} 1& 1& 1\\3& 5& 7\end{bmatrix} \quad C=\begin{bmatrix}2& -3\\ 0& 1 \end{bmatrix}$$
A=np.mat("4,0,5;-1,3,2") B=np.mat("1,1,1; 3,5,7") C=np.mat("2,-3; 0,1") print(A+B)
[[5 1 6] [2 8 9]]
try: A+C except: print("행렬의 사칙연산은 동일한 차원에서 실행됩니다.")
행렬의 사칙연산은 동일한 차원에서 실행됩니다.
print(2*B)
[[ 2 2 2] [ 6 10 14]]
print(A-2*B)
[[ 2 -2 3] [ -7 -7 -12]]
행렬곱(matrix product): 행렬들 사이의 각 벡터의 내적을 계산합니다. 연산은 식 1과 같이 이루어집니다.
$$\tag{식 1}\begin{bmatrix}\color{red}a&\color{red}b &\color{red}c\\\color{blue}d & \color{blue}e& \color{blue}f\end{bmatrix} \begin {bmatrix} \color{red}a& \color{blue}d\\ \color{red}b& \color{blue}e\\ \color{red}c&\color{blue}f \end{bmatrix} =\begin{bmatrix}\color{red}a\color{red}a+\color{red}b\color{red}b+\color{red}c\color{red}c& \color{red}a\color{blue}d+\color{red}b\color{blue}e+\color{red}c\color{blue}f \\ \color{blue}d\color{red}a+ \color{blue}e\color{red}b+\color{blue}f\color{red}c & \color{blue}d\color{blue}d+\color{blue}e\color{blue}e+\color{blue}f\color{blue}f\end{bmatrix}$$
- 식 2와 같이 앞 행렬의 행과 뒤 행렬의 열 사이에서 연산이 이루어지므로 앞행렬의 열수과 뒤 행렬의 행 수가 일치해야 합니다.
- 행렬곱의 결과의 차원은 앞행렬의 행수와 뒤 행렬의 열수가 됩니다.
- ⇒ m$\times$n · n$\times$p = m$\times$p
예 2)
행렬 A, B의 행렬곱
$$A=\begin{bmatrix}2& 3\\ 1& -5 \end{bmatrix} \quad B=\begin{bmatrix} 4& 3& 6\\1& -2& 3\end{bmatrix}$$
A=np.mat("2,3; 1, -5") B=np.mat("4,3,6; 1, -2, 3") A.shape, B.shape
((2, 2), (2, 3))
AB=A.dot(B) print(AB)
[[11 0 21] [-1 13 -9]]
행렬곱은 위 코드와 같이 np.dot(a, b)
함수 또는 메소드 a.dot(b)
를 적용할 수 있습니다. 또한 연산자인 @
을 사용할 수 있습니다.
print(A@B)
[[11 0 21] [-1 13 -9]]
행렬곱에서는 교환법칙이 성립되지 않습니다.
예 2)
행렬 A, B의 행렬곱의 교환법칙여부를 확인합니다.
$$A=\begin{bmatrix}5& 1\\ 3& -2 \end{bmatrix} \quad B=\begin{bmatrix} 2& 0\\ 4& 3\end{bmatrix}$$
A=np.mat("5,1; 3,-2") B=np.mat("2,0; 4, 3") AB=A@B print(AB)
[[14 3] [-2 -6]]
BA=B@A print(BA)
[[10 2] [29 -2]]
np.array_equal(AB, BA)
False
전치행렬의 특성은 식 2와 같습니다.
\begin{align}(A^T)^T=A\\ \tag{식 2}(A+B)^T=A^T+B^T\\(rA)^T=rA^T\\(AB)^T=B^TA^T\end{align}
예 2의 두 행렬 A, B에 대해 식 2를 확인해 봅니다.
A=np.mat("5,1; 3,-2") B=np.mat("2,0; 4, 3") ATT=A.T.T np.array_equal(A, ATT)
True
np.array_equal((A+B).T, A.T+B.T)
True
np.array_equal((A@B).T, B.T@A.T)
True
np.array_equal((3*A).T, 3*(A.T))
True
댓글
댓글 쓰기