행렬 연산
행렬의 기본연산은 같은 차원들 사이에서 이루어 집니다. 다음은 같은 차원의 두개 또는 세개 행렬들 사이에서 성립되는 관계를 나타낸 것입니다.
- 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=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과 같이 이루어집니다.
- 식 2와 같이 앞 행렬의 행과 뒤 행렬의 열 사이에서 연산이 이루어지므로 앞행렬의 열수과 뒤 행렬의 행 수가 일치해야 합니다.
- 행렬곱의 결과의 차원은 앞행렬의 행수와 뒤 행렬의 열수가 됩니다.
- ⇒ m
n · n p = m p
- ⇒ m
예 2)
행렬 A, B의 행렬곱
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=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와 같습니다.
예 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
댓글
댓글 쓰기