본문 바로가기
C.W.K.
Stream
Lesson 04 of 08 · published

단위행렬과 역행렬: 변환을 되돌리는 조건

~10 min · identity, inverse, linear-systems

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

행렬 곱셈의 1

스칼라에서 인 것처럼 행렬에는 단위행렬 가 있어. 주대각선은 1이고 나머지는 0이라서 모양이 맞으면 가 돼. 아무 변화도 일으키지 않는 변환이야.

되돌릴 수 있는 변환

정방행렬 에 대해 를 만족하는 행렬이 있으면 그걸 역행렬이라 불러. 30도 회전을 되돌리는 행렬은 -30도 회전이고, 모든 축을 두 배로 늘린 변환의 역행렬은 절반으로 줄여.

보통의 양쪽 역행렬이 있으려면 행렬이 정방이고 열과 행이 모두 선형독립이어야 해. 이 조건은 이론적으로 와 같아. 공간의 한 방향이라도 눌러 없애면 서로 다른 입력이 같은 출력으로 가므로 원래 입력을 하나로 복원할 수 없어.

직사각행렬과 의사역행렬

직사각행렬에는 정방행렬과 같은 양쪽 역행렬이 없어. 그렇다고 언제나 정보를 버리는 것도 아니야. 차원을 늘리는 전열랭크 변환은 입력을 구분해 보존할 수 있고 한쪽 역행렬을 가질 수도 있어. 반대로 차원을 줄이면 보통 여러 입력이 같은 출력으로 모여.

무어-펜로즈 의사역행렬 는 이런 경우를 한 틀로 다뤄. 과잉결정 선형시스템에서는 잔차의 제곱합을 가장 작게 하는 최소제곱해를, 해가 여럿이면 그중 노름이 가장 작은 해를 고르는 데 쓰여. 항상 원변환을 완벽히 되돌린다는 뜻은 아니야.

계산할 때는 solve

를 푸는 개념식은 지만, 실제 계산에서는 역행렬을 먼저 만들지 말고 np.linalg.solve(A, B)를 써. 보통 더 빠르고 수치오차도 덜 키워. 직사각 문제라면 lstsq처럼 문제에 맞는 해법을 골라.

역행렬은 ‘정보를 잃지 않은 변환’이라는 개념이야. 코드는 역행렬부터 만들기보다 선형시스템을 직접 풀어.

Code

역행렬 개념과 실제 계산 비교하기·python
import numpy as np

A = np.array([[2, 1],
              [1, 3]], dtype=float)

# 단위 검사
I = np.eye(2)
print(np.allclose(A @ I, A))      # True

# 역행렬 — 개념
A_inv = np.linalg.inv(A)
print(np.allclose(A @ A_inv, I))  # True (float modulo)

# 풀기 — 구현
B = np.array([5, 6])
X_via_inverse = A_inv @ B         # 교과서, 느림
X_via_solve   = np.linalg.solve(A, B)  # 실제 사용해야 할 것
print(np.allclose(X_via_inverse, X_via_solve))   # True

External links

Exercise

입력을 2배로 만드는 2×2 행렬과 그 역행렬을 만들고, 임의 벡터를 원래 값으로 되돌리는지 확인해. 이어서 행이 선형종속인 행렬 [[1, 1], [2, 2]]np.linalg.inv를 적용해 오류를 기록해.
Hint
2*np.eye(2)의 역행렬은 0.5*np.eye(2)야. 특이행렬의 역행렬 시도에서는 보통 LinAlgError: Singular matrix가 나지만 수치적으로 거의 특이한 행렬은 큰 오차를 만들 수도 있어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 2

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. Elechemist
    Elechemist

    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

    💛 by 피파warm
    1. 피파
      피파· warmElechemistElechemist

      좋아요. 2*np.eye(2)의 역행렬이 0.5*np.eye(2)이고, 같은 행이 반복된 S에서 LinAlgError: Singular matrix가 나는 흐름까지 정확해요. 한 가지 실전 습관만 더하면, 실제 풀이에서는 inv보다 solve를 먼저 떠올리면 됩니다.