Ch.7 §7.2 — 선형 변환의 행렬 (The Matrix of a Linear Transformation)

행렬을 구성하는 레시피: 기저 선택, 미분·적분 연산자, 합성 = 행렬 곱의 진짜 이유

§7.1 에서 “모든 선형 변환은 행렬이다” 라는 대응을 세웠다면, §7.2 는 그 행렬을 실제로 써 내려가는 레시피를 다룬다. 입력·출력 기저를 선택한 뒤 \(j\) 번째 입력 기저 벡터의 상을 출력 기저로 분해해 \(j\) 번째 열에 적는다는 단일 규칙으로, 다항식의 미분·적분 연산자, 회전·사영 행렬, 기저 변환 행렬이 모두 같은 공식에서 나온다는 사실을 보인다. 그리고 행렬 곱이 그런 모양으로 정의된 이유 — “합성 = 행렬 곱” — 이 이 구성에서 자연스럽게 귀결됨을 다룬다.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 11일

1 이 절이 해결하는 질문

Ch.7 §7.1 에서 다음을 보였다 (Strang, 2009, Ch.7 §7.1).

  • 선형 변환 \(T\)\(T(c\mathbf{v} + d\mathbf{w}) = c\, T(\mathbf{v}) + d\, T(\mathbf{w})\) 를 만족하는 추상적 함수이다.
  • 기저 벡터 \(\mathbf{v}_1, \ldots, \mathbf{v}_n\) 에서의 상 \(T(\mathbf{v}_1), \ldots, T(\mathbf{v}_n)\) 만 알면 \(T\) 전체가 결정된다.
  • 따라서 모든 선형 변환은 어떤 행렬 \(\mathbf{A}\) 로 표현된다.

이 선언은 강력하지만 공사 현장에서 당장 쓰기에는 허전하다. 실제 문제는 거의 항상 다음 형태로 온다.

\(T\) 가 “\(0\) 에서 \(x\) 까지의 적분” 이다. 어떤 행렬인가? \(T\) 가 “\(45^\circ\) 선 위로의 사영” 이다. 어떤 행렬인가? 입력 기저와 출력 기저가 다르면 공식이 어떻게 바뀌는가? 그리고 왜 행렬 곱은 하필 그 순서로 정의되었는가?

§7.2 의 역할은 이 “어떤 행렬인가” 에 답하는 단일 레시피를 제시하고, 그 레시피가 미분·적분·회전·사영 같은 서로 달라 보이는 변환을 모두 같은 틀로 쓰도록 함을 보이는 것이다.

한 문장 요약

변환의 행렬은 “입력 기저 벡터들이 변환 후 어디로 갔는지를, 출력 기저의 언어로 적어 내려간 장부” 이다.


2 핵심 레시피 (The Construction Rule)

정리: 선형 변환의 행렬 구성

\(V\) 가 기저 \(\mathcal{B} = \{\mathbf{v}_1, \ldots, \mathbf{v}_n\}\) 을, \(W\) 가 기저 \(\mathcal{C} = \{\mathbf{w}_1, \ldots, \mathbf{w}_m\}\) 을 가진다고 하자. 선형 변환 \(T : V \to W\)행렬 표현 \(\mathbf{A} = [T]_{\mathcal{C} \leftarrow \mathcal{B}}\) 은 다음과 같이 구성된다.

\(T\)\(j\) 번째 입력 기저 벡터 \(\mathbf{v}_j\) 에 적용한 뒤, 그 결과를 출력 기저로 분해한다. \[ T(\mathbf{v}_j) = a_{1j}\mathbf{w}_1 + a_{2j}\mathbf{w}_2 + \cdots + a_{mj}\mathbf{w}_m \]

그러면 \(\mathbf{A}\)\(j\) 번째 열\(\begin{bmatrix} a_{1j} \\ a_{2j} \\ \vdots \\ a_{mj} \end{bmatrix}\) 이다.

한 번 더 풀어 쓰면 이렇다.

\(j\) 번째 입력 기저를 \(T\) 에 통과시킨다 → 결과를 출력 기저로 분해한다 → 분해 계수들이 \(j\) 번째 열이다.”

왜 이것이 맞는가 (증명 스케치). 임의의 입력 \(\mathbf{v} = c_1\mathbf{v}_1 + \cdots + c_n\mathbf{v}_n\) 에 대해 선형성으로

\[ T(\mathbf{v}) = c_1 T(\mathbf{v}_1) + \cdots + c_n T(\mathbf{v}_n) \]

\(T(\mathbf{v}_j)\)\(\mathcal{C}\) 로 분해한 식을 대입하고 \(\mathbf{w}_i\) 앞에 모이는 계수를 모으면 \(i\) 번째 출력 좌표는

\[ [T(\mathbf{v})]_i = \sum_{j=1}^{n} a_{ij} c_j \]

이는 정확히 행렬 곱 \(\mathbf{A}\mathbf{c}\)\(i\) 번째 성분이다. 즉 \(T\) 를 좌표로 번역한 연산이 \(\mathbf{A}\mathbf{c}\) 와 같다.

직관 요약. 행렬은 “\(n\) 개 입력 기저에 대한 \(T\) 의 이력서” 이다. 입력 기저 \(n\) 개의 행선지를 출력 기저 좌표로 기록해 두기만 하면, 그 뒤로는 선형성이 나머지 모든 계산을 떠맡는다.


3 두 기저의 선택이 행렬을 결정한다

같은 \(T\) 라도 기저 \(\mathcal{B}, \mathcal{C}\) 를 바꾸면 행렬이 완전히 달라진다. 이 사실을 명확히 보기 위해 §7.2 의 레시피를 네 가지 “기저 조합”에서 적용한다.

입력 기저 \(\mathcal{B}\) 출력 기저 \(\mathcal{C}\) 결과
표준 기저 표준 기저 “표준 행렬” — 우리가 흔히 아는 \(\mathbf{A}\)
표준 기저 비표준 기저 행이 재조합됨
비표준 기저 표준 기저 열이 재조합됨
고유벡터 기저 (같은 기저) 고유벡터 기저 대각행렬 \(\mathbf{\Lambda}\) — 가장 단순

마지막 행이 중요하다. “좋은 기저를 고르면 행렬이 대각행렬이 된다” 는 사실이 §7.3 의 대각화와 §6.7 SVD 의 출발점이다. 즉 대각화는 기저 선택 문제이다 (Strang, 2009, Ch.7).


4 예시 1 — 다항식 공간의 미분 연산자

선형 변환은 \(\mathbb{R}^n\) 에 국한되지 않는다. 가장 교훈적인 예는 다항식 공간에서의 미분이다. 이 예는 “벡터가 꼭 좌표 튜플일 필요는 없다” 는 사실과 “레시피는 어느 벡터 공간에서나 똑같다” 는 사실을 동시에 보여준다.

4.1 정의역과 공역

  • 입력 공간 \(V = \mathcal{P}_3 = \{a + bx + cx^2 + dx^3 : a, b, c, d \in \mathbb{R}\}\), 차수 \(\leq 3\) 인 다항식 — \(n = 4\) 차원
  • 출력 공간 \(W = \mathcal{P}_2\), 차수 \(\leq 2\) 인 다항식 — \(m = 3\) 차원
  • 변환 \(T = \dfrac{d}{dx}\): 미분은 선형이다 (\(\frac{d}{dx}(cv + dw) = c\frac{dv}{dx} + d\frac{dw}{dx}\)).

4.2 기저 선택

자연스러운 기저를 쓴다.

  • 입력 기저 \(\mathcal{B} = \{1,\, x,\, x^2,\, x^3\}\)
  • 출력 기저 \(\mathcal{C} = \{1,\, x,\, x^2\}\)

4.3 레시피 적용

각 입력 기저 벡터를 \(T\) 에 넣는다.

\(j\) \(\mathbf{v}_j\) \(T(\mathbf{v}_j) = v_j'\) 출력 기저 분해 \(j\)
1 \(1\) \(0\) \(0\cdot 1 + 0\cdot x + 0\cdot x^2\) \((0, 0, 0)\)
2 \(x\) \(1\) \(1\cdot 1 + 0\cdot x + 0\cdot x^2\) \((1, 0, 0)\)
3 \(x^2\) \(2x\) \(0\cdot 1 + 2\cdot x + 0\cdot x^2\) \((0, 2, 0)\)
4 \(x^3\) \(3x^2\) \(0\cdot 1 + 0\cdot x + 3\cdot x^2\) \((0, 0, 3)\)

이 네 열을 나란히 세우면 미분 연산자의 행렬이 완성된다.

\[ \mathbf{A}_{d/dx} = \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 3 \end{bmatrix} \]

4.4 행렬 곱으로 직접 확인

입력 \(v = 4 + x + x^2 + x^3\) 의 좌표 벡터는 \((4, 1, 1, 1)^\top\). 미분의 결과는 \(1 + 2x + 3x^2\), 좌표 \((1, 2, 3)^\top\) 이어야 한다.

\[ \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 3 \end{bmatrix} \begin{bmatrix} 4 \\ 1 \\ 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix} \checkmark \]

4.5 이 예시에서 읽어야 할 세 가지

  1. 커널 = 상수함수. 첫 번째 열이 \((0, 0, 0)\) 이다. 이는 \(T(1) = 0\) 이라는 사실을 행렬이 “기억” 하는 방식이다. 커널 차원 \(= 1\). 일반적으로 “행렬의 영 열은 그 입력 기저가 커널에 속한다” 는 신호이다.
  2. 치역 = 차수 \(\leq 2\) 다항식 전체. 2, 3, 4 번째 열이 독립이므로 열공간의 차원 \(= 3 = \dim W\). 치역이 출력 공간 전체이다.
  3. Rank-Nullity 검증. \(3 + 1 = 4 = \dim V\). 계수-영차원 정리가 행렬에서도, 추상 공간에서도 똑같이 성립한다. 두 관점이 “같은 현상의 다른 언어” 임이 이 수치에서 확인된다.
직관 보강 — “미분은 지수를 앞으로 꺼내 내린다”

행렬 \(\mathbf{A}_{d/dx}\) 의 대각 위 원소 \(1, 2, 3\)\(x, x^2, x^3\) 를 미분할 때 앞으로 나오는 지수이다. 행렬 표현이 미적분의 “멱함수 미분 법칙” 을 선형대수의 언어로 정확히 재현한 것이다. 규칙을 다른 방식으로 두 번 기록한 것이므로, 둘 중 어느 쪽으로 보든 기억하기 쉽다.


5 예시 2 — 적분 연산자: “한쪽 역행렬”

미분의 역은 적분이다. \(T^{-1} : \mathcal{P}_2 \to \mathcal{P}_3\), \(T^{-1}(w) = \int_0^x w(t)\, dt\).

출력 기저 \(\{1, x, x^2\}\) 의 각 원소에 \(T^{-1}\) 을 적용하면

\[ \int_0^x 1\, dt = x, \qquad \int_0^x t\, dt = \tfrac{1}{2} x^2, \qquad \int_0^x t^2\, dt = \tfrac{1}{3} x^3 \]

이 결과들을 입력 기저 \(\{1, x, x^2, x^3\}\) 으로 분해하면 행렬이 얻어진다.

\[ \mathbf{A}_{\int} = \begin{bmatrix} 0 & 0 & 0 \\ 1 & 0 & 0 \\ 0 & \tfrac{1}{2} & 0 \\ 0 & 0 & \tfrac{1}{3} \end{bmatrix} \quad (4 \times 3) \]

5.1 미분과 적분의 결합 — 미적분학의 기본정리, 행렬 버전

\[ \mathbf{A}_{d/dx}\, \mathbf{A}_{\int} = \mathbf{I}_3, \qquad \mathbf{A}_{\int}\, \mathbf{A}_{d/dx} = \begin{bmatrix} 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \]

해석.

  • \(\mathbf{A}_{d/dx}\mathbf{A}_{\int} = \mathbf{I}\): 적분 후 미분하면 원래로 돌아온다. 양쪽이 완벽히 맞물린다.
  • \(\mathbf{A}_{\int}\mathbf{A}_{d/dx} \neq \mathbf{I}\): 미분 후 적분하면 상수항이 사라진다. 첫 번째 열이 영이다.

직사각 행렬에는 양쪽 역행렬이 없고 오직 한쪽 역행렬(one-sided inverse)만 있을 수 있다. 적분은 미분의 오른쪽 역이지 왼쪽 역은 아니다. 이 불일치가 “적분은 상수를 복원하지 못한다” 는 미적분학의 기본 사실을 행렬 수준에서 포착한다 (Strang, 2009, Ch.7 §7.2).


6 예시 3 — 같은 변환, 두 개의 다른 행렬 (사영)

\(45^\circ\) 선 위로 사영하는 변환 \(T\) 를 두 가지 기저로 각각 행렬화한다. 이것이 “기저 선택이 행렬을 결정한다” 는 주장을 가장 선명하게 보여준다.

6.1 선택 1 — \(\{45^\circ, 135^\circ\}\) 기저 (좋은 기저)

  • \(\mathbf{v}_1 = (1, 1) / \sqrt{2}\): 선 위. \(T(\mathbf{v}_1) = \mathbf{v}_1\). 출력 좌표 \((1, 0)\).
  • \(\mathbf{v}_2 = (-1, 1) / \sqrt{2}\): 선에 수직. \(T(\mathbf{v}_2) = \mathbf{0}\). 출력 좌표 \((0, 0)\).

\[ \mathbf{A}_{\text{좋은 기저}} = \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \]

이 행렬은 대각이며, \(T\) 의 본질 — “한 방향만 살리고 다른 방향을 죽인다” — 이 형태 자체에서 읽힌다.

6.2 선택 2 — 표준 기저 \(\{(1,0), (0,1)\}\)

두 기저 벡터 모두 \(45^\circ\) 선 위로 사영하면 \((1/2, 1/2)\) 로 간다.

\[ \mathbf{A}_{\text{표준}} = \begin{bmatrix} 1/2 & 1/2 \\ 1/2 & 1/2 \end{bmatrix} \]

이 행렬은 대각이 아니지만 같은 변환이다. 두 행렬은 같은 선형 변환의 서로 다른 옷이며, 둘 사이는 유사 변환 공식 \(\mathbf{A}_\text{좋은 기저} = \mathbf{M}^{-1} \mathbf{A}_\text{표준} \mathbf{M}\) 로 연결된다 (여기서 \(\mathbf{M}\) 의 열은 새 기저 벡터를 표준 좌표로 쓴 것이다).

교훈. 대각화와 고유값 분해는 결국 “변환을 가장 잘 드러내는 기저 — 변환의 고유 축 — 를 찾는 문제” 이다. 그 기저에서 변환은 단순한 스케일링으로 보이고, 그것이 대각행렬로 표현된다.

반복 투영 테스트

사영 행렬은 \(T^2 = T\) 를 만족한다 (“두 번 사영해도 결과는 같다”). 두 행렬 모두에 대해

\[ \begin{bmatrix}1 & 0 \\ 0 & 0\end{bmatrix}^2 = \begin{bmatrix}1 & 0 \\ 0 & 0\end{bmatrix}, \qquad \begin{bmatrix}1/2 & 1/2 \\ 1/2 & 1/2\end{bmatrix}^2 = \begin{bmatrix}1/2 & 1/2 \\ 1/2 & 1/2\end{bmatrix} \]

가 성립한다. 이는 변환의 본질적 성질(멱등성)이 좌표 선택과 무관하다는 또 다른 증거이다.


7 합성 = 행렬 곱 — 행렬 곱이 “그렇게” 정의된 진짜 이유

§7.2 가 선사하는 가장 깊은 통찰은 이것이다. 행렬 곱이 이상한 순서로 정의된 것은 그것이 선형 변환의 합성을 올바르게 표현하기 위해서다.

7.1 세 공간 사이의 두 변환

세 공간 \(U, V, W\) 와 두 변환

\[ S : U \to V, \qquad T : V \to W \]

을 생각한다. 합성 \(T \circ S : U \to W\) 도 선형 변환이다. 이제 기저를 고정한다.

  • \(U\) 의 기저 \(\mathcal{B}_U\), \(V\) 의 기저 \(\mathcal{B}_V\), \(W\) 의 기저 \(\mathcal{B}_W\).
  • \(S\) 의 행렬 \(\mathbf{B} = [S]_{\mathcal{B}_V \leftarrow \mathcal{B}_U}\) (크기 \(n \times p\))
  • \(T\) 의 행렬 \(\mathbf{A} = [T]_{\mathcal{B}_W \leftarrow \mathcal{B}_V}\) (크기 \(m \times n\))

주의: \(S\) 의 출력 기저와 \(T\) 의 입력 기저가 같아야 한다. 그래야 “한 쪽이 내놓은 좌표를 다른 쪽이 바로 받는” 번역이 가능하다.

7.2 정리: 합성의 행렬 = 행렬의 곱

\[ [T \circ S]_{\mathcal{B}_W \leftarrow \mathcal{B}_U} = \mathbf{A} \mathbf{B} \]

읽는 법. 임의의 \(\mathbf{u} \in U\) 를 좌표 \(\mathbf{x}\) 로 표현하면

  1. \(S\)\(\mathbf{x}\)\(\mathbf{B}\mathbf{x}\) 로 번역 (결과는 \(V\) 의 좌표).
  2. \(T\) 가 그 결과를 \(\mathbf{A}(\mathbf{B}\mathbf{x})\) 로 번역 (결과는 \(W\) 의 좌표).
  3. 좌표 공간에서 전체 변환은 \((\mathbf{A}\mathbf{B})\mathbf{x}\) 와 같다 — 결합법칙이 이것을 보장한다.

따라서 합성을 좌표로 옮기면 정확히 행렬 곱이 된다. \((\mathbf{A}\mathbf{B})_{ij}\) 가 “\(\mathbf{A}\)\(i\) 행과 \(\mathbf{B}\)\(j\) 열의 내적” 인가 라는 물음에 대한 답이 바로 여기에 있다.

7.3 유도 — 한 번만 해 두면 평생 남는다

\(S(\mathbf{u}_k) = \sum_j b_{jk} \mathbf{v}_j\) (열 \(k\) 정의), \(T(\mathbf{v}_j) = \sum_i a_{ij} \mathbf{w}_i\) (열 \(j\) 정의) 이므로

\[ (T \circ S)(\mathbf{u}_k) = T\left(\sum_j b_{jk} \mathbf{v}_j\right) = \sum_j b_{jk}\, T(\mathbf{v}_j) = \sum_j b_{jk}\, \sum_i a_{ij}\, \mathbf{w}_i = \sum_i \left(\sum_j a_{ij} b_{jk}\right) \mathbf{w}_i \]

괄호 안의 \(\sum_j a_{ij}b_{jk}\) 가 정확히 \(\mathbf{A}\mathbf{B}\)\((i, k)\) 원소이다. 즉 행렬 곱의 정의는 합성 규칙에서 강제로 튀어나온다. “이상한 순서” 가 아니라 “유일하게 맞는 순서” 이다.

순서 주의

합성 \(T \circ S\) 는 “\(S\) 를 먼저, \(T\) 를 나중에” 이지만 행렬 곱 \(\mathbf{A}\mathbf{B}\) 는 “\(\mathbf{A}\) 가 왼쪽, \(\mathbf{B}\) 가 오른쪽” 이다. 함수 기호는 오른쪽에서 왼쪽으로 읽어야 하므로 순서가 뒤집혀 보인다. 이 규칙을 “먼저 쓰이는 것이 오른쪽에 온다” 로 기억하면 실수가 줄어든다.


8 기저 변환 행렬 — 항등 변환의 행렬화

기저 변환 행렬 \(\mathbf{M}\) 자체가 “항등 변환을 비자명한 기저 쌍 아래에서 행렬화” 한 결과라는 관점은 기억해 두면 큰 힘이 된다.

\(I : V \to V\), \(I(\mathbf{v}) = \mathbf{v}\). 이 자명한 변환을 입력 기저 \(\mathcal{B}'\), 출력 기저 \(\mathcal{B}\) 로 행렬화하면 무엇이 나오는가? §7.2 레시피를 그대로 적용한다.

\(j\) 번째 열 \(=\) \(I(\mathbf{v}'_j) = \mathbf{v}'_j\) 을 원래 기저 \(\mathcal{B}\) 로 분해한 좌표.

\(\mathbf{M}\)\(j\) 번째 열은 “새 기저 벡터 \(\mathbf{v}'_j\) 를 원래 기저로 적은 좌표” 이다. 이것이 정확히 §7.1 에서 소개한 change-of-basis matrix 의 정의이다.

8.1 같은 변환의 두 행렬을 연결하는 식

\(T : V \to V\) 의 두 표현을 연결하려면 “신좌표 → 구좌표 → \(T\) → 구좌표 → 신좌표” 의 경로를 각 단계가 모두 하나의 행렬 곱이 되도록 설계해야 한다. 각 단계는 선형 변환이고, 변환들의 합성은 행렬 곱이므로

\[ [T]_{\mathcal{B}' \leftarrow \mathcal{B}'} = \underbrace{\mathbf{M}^{-1}}_{\text{구}\to\text{신}}\; \underbrace{[T]_{\mathcal{B} \leftarrow \mathcal{B}}}_{\text{구좌표에서 } T}\; \underbrace{\mathbf{M}}_{\text{신}\to\text{구}} \]

가 얻어진다. 유사 변환 공식이 §7.2 의 구성 규칙과 합성 법칙에서 자동으로 나온 것이다.


9 응용

분야 §7.2 가 주는 도구 구체적 활용
수치해석 유한차분 행렬 = 이산 미분 연산자 미분 방정식의 수치해, 유한요소법
딥러닝 선형층 구성 가중치 초기화가 “기저 선택” 과 동치, 의미 있는 기저를 학습하는 것
신호처리 DFT 행렬 = 시간 기저 → 주파수 기저의 기저 변환 FFT 의 수학적 정체
통계 다항 회귀의 설계행렬 \(1, x, x^2\) 기저의 값을 행으로 쌓은 것
양자역학 관측 가능량의 행렬 표현 서로 다른 기저(위치·운동량·에너지)에서 같은 연산자의 다른 얼굴
PCA 공분산의 고유벡터 기저로 변환 “자연스러운 특징 축” 을 데이터로부터 발견

특히 다항 회귀의 설계행렬 \(\mathbf{X}\) 는 이 절의 미분 예시와 같은 공간 (\(\mathcal{P}_d\)) 에서 구성된다. 각 행은 “기저 벡터 \(1, x, x^2, \ldots\) 를 해당 관측값에서 평가한 값” 이고, 회귀 계수 \(\boldsymbol{\beta}\) 는 “그 기저 위에서의 좌표” 이다. 다항 회귀가 “고차 다항 함수를 피팅한다” 는 말은 사실 “다항식 벡터 공간 \(\mathcal{P}_d\) 에서 기저 좌표를 추정한다” 는 뜻이다. 이 해석은 §7.2 관점 없이는 형식적으로 드러나지 않는다.


10 코드 예시

10.1 Step 1 — 미분 연산자 행렬을 레시피로 직접 구성

# 다항식 공간 P_3 → P_2 에서 미분 연산자 행렬을 §7.2 레시피로 만든다
# 벡터 = (a_0, a_1, a_2, a_3) 계수 튜플, 함수 값은 신경쓰지 않는다

def differentiate(poly):
    """poly = (a_0, a_1, a_2, a_3) → (a_1, 2 a_2, 3 a_3)"""
    a0, a1, a2, a3 = poly
    return (a1, 2 * a2, 3 * a3)

# 입력 기저 벡터 — P_3 의 표준 기저
basis_in = [
    (1, 0, 0, 0),  # v_1 = 1
    (0, 1, 0, 0),  # v_2 = x
    (0, 0, 1, 0),  # v_3 = x^2
    (0, 0, 0, 1),  # v_4 = x^3
]

# 각 입력 기저 벡터를 T 에 넣고 결과를 그대로 행렬의 열로 쌓는다
# (출력 기저도 표준이므로 별도 분해가 필요 없다)
A = [[0] * 4 for _ in range(3)]
for j, v in enumerate(basis_in):
    Tv = differentiate(v)
    for i, val in enumerate(Tv):
        A[i][j] = val

for row in A:
    print(row)

# 행렬 곱으로 미분을 계산 — 전통적 미분 규칙을 쓰지 않는다
def mat_vec(M, x):
    return tuple(sum(M[i][j] * x[j] for j in range(len(x))) for i in range(len(M)))

v = (4, 1, 1, 1)                  # 4 + x + x^2 + x^3
print("행렬 곱 결과:", mat_vec(A, v))   # (1, 2, 3)  → 1 + 2x + 3x^2
print("직접 미분  :", differentiate(v))  # (1, 2, 3)  동일

해석. 이 코드는 §7.2 의 핵심 주장을 단 한 번의 실행으로 검증한다. 입력 기저 벡터 \(n\) 개의 상만 알면 변환 전체를 행렬로 복원할 수 있고, 복원된 행렬은 임의의 다른 벡터에서도 원래 변환과 일치한다. 함수적 정의(미분 규칙)와 수치적 정의(행렬 곱)가 같은 결과를 낸다는 것이 눈으로 확인된다.

10.2 Step 2 — 합성 = 행렬 곱 검증 (적분 후 미분)

import numpy as np

# 미분 행렬 D : P_3 → P_2  (3 × 4)
D = np.array([
    [0, 1, 0, 0],
    [0, 0, 2, 0],
    [0, 0, 0, 3],
], dtype=float)

# 적분 행렬 I : P_2 → P_3  (4 × 3) — 출력 기저 {1, x, x^2} 로부터 구성
Int = np.array([
    [0,    0,    0    ],
    [1,    0,    0    ],
    [0,    1/2,  0    ],
    [0,    0,    1/3  ],
])

# 적분 후 미분 — P_2 → P_3 → P_2 의 합성은 (D @ Int) 가 되어야 한다
print("D @ Int =")
print(D @ Int)                      # 단위 행렬 I_3

# 미분 후 적분 — P_3 → P_2 → P_3 은 상수항이 사라진 대각행렬
print("Int @ D =")
print(Int @ D)

해석. D @ Int 가 단위 행렬이라는 것이 “적분 후 미분은 원상 복구” 라는 미적분학의 기본 정리를 행렬 언어로 포착한 것이다. 반대로 Int @ D 는 첫 번째 열이 \(\mathbf{0}\) 이 되어 있어, “미분 후 적분은 상수를 복원하지 못한다” 는 사실이 정확히 행렬의 영 열로 나타난다. 직사각 행렬이 가지는 한쪽 역행렬의 의미가 숫자로 드러나는 순간이다.

10.3 Step 3 — 기저 선택이 행렬을 바꾼다 (사영의 두 얼굴)

import numpy as np

# 45도 선 위로 사영하는 변환을 두 기저에서 본다

# 1) 표준 기저에서
A_std = np.array([
    [0.5, 0.5],
    [0.5, 0.5],
])

# 2) 좋은 기저 = {45도 방향, 135도 방향}
M = np.array([                # 열이 새 기저 벡터 (표준 좌표)
    [1,  -1],
    [1,   1],
]) / np.sqrt(2)

# 유사 변환: A_good = M^{-1} A_std M
A_good = np.linalg.inv(M) @ A_std @ M

print("A_std  =\n", A_std)
print("\nA_good =\n", np.round(A_good, 10))

# 불변량 확인 — 기저를 바꿔도 같은 값이 나온다
print("\n트레이스  :", np.trace(A_std), np.trace(A_good))
print("행렬식    :", np.linalg.det(A_std), np.linalg.det(A_good))
print("고유값    :", np.sort(np.linalg.eigvals(A_std).real),
      np.sort(np.linalg.eigvals(A_good).real))

해석. 두 행렬의 모양은 완전히 다르지만 트레이스, 행렬식, 고유값 같은 불변량은 모두 일치한다. 이것이 “같은 변환” 이라는 주장의 수치적 증거이다. 좋은 기저에서의 대각행렬이 “가장 알아보기 쉬운 형태” 이고, 이 기저를 데이터로부터 자동으로 찾는 방법 이 바로 Ch.6 의 고유값 분해와 §6.7 의 SVD 이다.


11 정리

§7.2 의 핵심은 한 줄로 요약할 수 있다.

\(T\) 의 행렬은, 입력 기저 벡터의 상을 출력 기저의 좌표로 적어 열에 쌓은 것이다.

이 단순한 규칙에서 다음 결과들이 모두 따라 나온다.

  1. 미분·적분·회전·사영 같은 분야별 연산자들이 공통된 레시피로 행렬화된다.
  2. 직사각 행렬의 한쪽 역행렬이 미적분학의 기본 정리를 행렬 수준에서 포착한다.
  3. 입력·출력 기저를 바꾸면 같은 변환이 다른 행렬이 된다 — 유사 변환 공식의 기원.
  4. 합성 \(T \circ S\) 의 행렬이 \(\mathbf{A}\mathbf{B}\) 라는 사실이 행렬 곱의 정의 그 자체의 이유 이다.
  5. 대각화·SVD 는 “행렬이 가장 단순해지는 기저 선택” 이라는 하나의 질문에 대한 답이다.

이어지는 §7.3 는 이 레시피를 가지고 “가장 좋은 기저를 고르는 기준” 으로 나아간다 — 고유벡터 기저에서의 대각화와 SVD 기저에서의 의사역행렬(pseudoinverse) 이 그 결과이다.


12 관련 주제

선행 지식

후속 주제

다른 카테고리 연결

교재 참조

  • Strang, Introduction to Linear Algebra, 4th Ed., Ch.7 §7.2 “The Matrix of a Linear Transformation” (pp. 384–398)

Subscribe

Enjoy this blog? Get notified of new posts by email: