같은 객체, 다른 구조
행렬도 모양과 제약에 따라 성질이 달라져. 제약은 귀찮은 족쇄가 아니라 어떤 연산이 가능하고 싼지 알려 주는 type hint야.
| 유형 | 제약 | 왜 쓸모 있나 |
|---|---|---|
| 정방 | 행 수 = 열 수 | 행렬식과 고유값을 정의할 수 있고, 비특이일 때 역행렬도 가져. |
| 직사각(rectangular) | 차원을 바꿔. 예를 들면 1,024차원을 256차원으로 투영해. | |
| 대각 | 대각 밖이 0 | 축별로 스케일하고 대각 성분만 계산하면 돼. |
| 단위 | 대각은 1, 나머지는 0 | 곱셈 항등원이라 야. |
| 영 | 모든 성분이 0 | 같은 모양의 행렬끼리 더할 때 덧셈 항등원이야. |
| 대칭 | 상관·에너지 모형에 자주 나오고 실수 고유분해 성질이 좋아. | |
| 희소 | 대부분의 성분이 0 | 0이 아닌 성분 중심으로 저장·계산해 메모리와 연산을 아껴. |
왜 신경 써야 해
단위행렬은 정규화와 선형계 공식에, 대각행렬은 스케일링과 SVD에, 대칭행렬은 공분산과 그래프·에너지 문제에 자주 나와. 희소행렬 덕분에 거대한 추천 행렬과 그래프도 메모리에 올릴 수 있고.
직사각행렬에는 보통의 양쪽 역행렬이 없지만 최소제곱해와 유사역행렬은 쓸 수 있어. 정방행렬도 특이면 역행렬이 없어. 모양만 보고 ‘역행렬 있음’이라고 단정하지 마.
행렬 유형은 수학의 type hint야. 유형을 알아보면 어떤 연산이 싸고 어떤 가정이 깨지는지 보여. 희소행렬을 무턱대고 dense로 만들지 말고, 대칭이 아닌 행렬에 대칭 전용 알고리즘을 쓰지도 마.
import numpy as np
D = np.diag([2., 0.5, -1.]) v = np.array([10., 10., 10.])
print('D =') print(D) print('D @ v =', D @ v)