행렬 곱셈의 1
스칼라에서 인 것처럼 행렬에는 단위행렬 가 있어. 주대각선은 1이고 나머지는 0이라서 모양이 맞으면 가 돼. 아무 변화도 일으키지 않는 변환이야.
되돌릴 수 있는 변환
정방행렬 에 대해 를 만족하는 행렬이 있으면 그걸 역행렬이라 불러. 30도 회전을 되돌리는 행렬은 -30도 회전이고, 모든 축을 두 배로 늘린 변환의 역행렬은 절반으로 줄여.
보통의 양쪽 역행렬이 있으려면 행렬이 정방이고 열과 행이 모두 선형독립이어야 해. 이 조건은 이론적으로 와 같아. 공간의 한 방향이라도 눌러 없애면 서로 다른 입력이 같은 출력으로 가므로 원래 입력을 하나로 복원할 수 없어.
직사각행렬과 의사역행렬
직사각행렬에는 정방행렬과 같은 양쪽 역행렬이 없어. 그렇다고 언제나 정보를 버리는 것도 아니야. 차원을 늘리는 전열랭크 변환은 입력을 구분해 보존할 수 있고 한쪽 역행렬을 가질 수도 있어. 반대로 차원을 줄이면 보통 여러 입력이 같은 출력으로 모여.
무어-펜로즈 의사역행렬 는 이런 경우를 한 틀로 다뤄. 과잉결정 선형시스템에서는 잔차의 제곱합을 가장 작게 하는 최소제곱해를, 해가 여럿이면 그중 노름이 가장 작은 해를 고르는 데 쓰여. 항상 원변환을 완벽히 되돌린다는 뜻은 아니야.
계산할 때는 solve
를 푸는 개념식은 지만, 실제 계산에서는 역행렬을 먼저 만들지 말고 np.linalg.solve(A, B)를 써. 보통 더 빠르고 수치오차도 덜 키워. 직사각 문제라면 lstsq처럼 문제에 맞는 해법을 골라.
import numpy as np
A = np.array([[2., 0.], [0., 2.]]) Ainv = np.linalg.inv(A)
print('Ainv =') print(Ainv)
v = np.array([10., 8.]) print('Ainv @ v =', Ainv @ v) print('v / 2 =', v / 2)
S = np.array([[1., 2.], [1., 2.]]) try: np.linalg.inv(S) except Exception as e: print(type(e).name, '->', e)
에러는 역행렬이 존재하지 않으므로 발생, LinAlgError -> Singular matrix