Chapter 02

행렬은 선형 변환이다

1장에서 벡터를 더하고 늘이며 선형 결합을 만들었습니다. 이 장은 그 선형 결합을 통째로 실어 나르는 함수, 선형 변환을 다룹니다. 놀라운 사실은 유클리드 공간 사이의 선형 변환이 예외 없이 행렬 하나로 적힌다는 것입니다. 그러니 행렬은 숫자 표가 아니라 함수이고, 행렬–벡터 곱은 함수에 값을 넣는 일, 행렬 곱은 함수를 이어 붙이는 일, 전치는 내적을 반대편으로 옮기는 일입니다. 이 관점 하나로 곱셈 규칙이 왜 그렇게 생겼는지, 왜 AB≠BAAB \ne BA인지, 왜 게임 엔진은 3×3이 아니라 4×4 행렬을 쓰는지, 왜 GPU가 행렬 곱에 목숨을 거는지가 한 줄로 이어집니다.

이 수식이 없었다면실시간 3D 그래픽

게임 화면의 캐릭터는 수만 개에서 수백만 개의 꼭짓점(정점)으로 만든 다면체입니다. 매 프레임 이 정점들을 캐릭터 자신의 좌표에서 세계 좌표로, 세계에서 카메라 좌표로, 다시 원근 투영을 거쳐 화면 좌표로 옮겨야 합니다. 회전, 크기 조절, 이동, 투영을 정점마다 따로 공식으로 계산한다면 한 프레임에 해야 할 일이 감당할 수 없이 늘어납니다.

해법은 모든 단계를 4×4 행렬로 쓰고, 미리 곱해 행렬 하나로 합치는 것입니다. 정점 셰이더는 그 행렬 하나를 각 정점에 곱할 뿐입니다. 평행이동처럼 원래는 선형이 아닌 동작도 동차 좌표라는 요령으로 행렬 곱 안에 들어옵니다. 그래서 그래픽 하드웨어는 처음부터 "작은 행렬과 벡터를 엄청나게 많이 곱하는 기계"로 설계되었고, 같은 하드웨어가 오늘날 신경망의 거대한 행렬 곱을 맡고 있습니다.

정점마다 회전·이동·투영→공식이 단계마다 따로→변환 = 행렬, 합성 = 곱→정점당 4×4 곱 한 번

선형 변환: 선형 결합을 보존하는 함수

함수 하나를 알려면 입력을 몇 개나 넣어 봐야 할까

블랙박스 장치가 하나 있습니다. 2차원 벡터를 넣으면 2차원 벡터가 나옵니다. 장치의 동작을 완전히 알아내려면 평면의 모든 점(무한히 많은 점)을 넣어 봐야 할까요? 일반적인 함수라면 그렇습니다. 그런데 장치가 "입력을 더해서 넣으면 출력도 더해져서 나오고, 입력을 2배 하면 출력도 2배"라는 성질만 갖는다면 이야기가 완전히 달라집니다.

정의 2.1 (선형 변환) 함수 T:Rn→RmT:\mathbb{R}^n\to\mathbb{R}^m이 모든 벡터 u,v\mathbf{u},\mathbf{v}와 모든 실수 cc에 대해
T(u+v)=T(u)+T(v)(가법성),T(c u)=c T(u)(동차성)T(\mathbf{u}+\mathbf{v}) = T(\mathbf{u}) + T(\mathbf{v}) \quad(\text{가법성}), \qquad T(c\,\mathbf{u}) = c\,T(\mathbf{u}) \quad(\text{동차성})
를 만족하면 선형 변환(linear transformation, linear map)이라 한다. 두 조건을 합쳐 T(au+bv)=aT(u)+bT(v)T(a\mathbf{u}+b\mathbf{v}) = aT(\mathbf{u})+bT(\mathbf{v}) 하나로 써도 같다. 즉 선형 결합을 넣으면 출력의 같은 선형 결합이 나온다.

정의에서 곧바로 나오는 사실 두 개가 검사에 유용합니다. 첫째, c=0c=0을 넣으면 T(0)=0T(\mathbf{0}) = \mathbf{0}입니다. 원점을 움직이는 함수는 선형이 아닙니다. 둘째, 직선 p+td\mathbf{p}+t\mathbf{d}는 T(p)+tT(d)T(\mathbf{p})+tT(\mathbf{d})로 가므로 직선은 직선(또는 한 점)으로, 평행선은 평행선으로, 등간격 눈금은 등간격 눈금으로 갑니다. 격자가 휘지 않는다는 것이 선형 변환의 시각적 정의입니다.

u v u + v 입력 공간 T T(u) T(v) T(u + v) = T(u) + T(v) 출력 공간 평행사변형은 평행사변형으로 간다
그림 2-1. 가법성의 그림. 입력에서 u와 v로 만든 평행사변형의 대각선 u + v는, 선형 변환 뒤에도 T(u)와 T(v)로 만든 평행사변형의 대각선이 된다. "더하고 나서 보내기"와 "보내고 나서 더하기"가 같다는 뜻이다(여기서 T는 행렬 [1 −0.6; 0.4 1]).

이제 문제의 답입니다. 평면의 모든 벡터는 x=x1e1+x2e2\mathbf{x} = x_1\mathbf{e}_1 + x_2\mathbf{e}_2로 쓸 수 있으므로, 선형이라면 T(x)=x1T(e1)+x2T(e2)T(\mathbf{x}) = x_1T(\mathbf{e}_1) + x_2T(\mathbf{e}_2)입니다. 입력 두 개, e1\mathbf{e}_1과 e2\mathbf{e}_2만 넣어 보면 장치의 모든 것을 안다는 뜻입니다. 이것을 일반 차원에서 정리로 적으면 다음과 같습니다.

정리 2.2 (선형 변환의 표준 행렬) T:Rn→RmT:\mathbb{R}^n\to\mathbb{R}^m이 선형이면 모든 x\mathbf{x}에 대해 T(x)=AxT(\mathbf{x}) = A\mathbf{x}인 m×nm\times n 행렬 AA가 꼭 하나 있다. 그 행렬의 jj열은 T(ej)T(\mathbf{e}_j)이다.
A=[  T(e1)    T(e2)    ⋯    T(en)  ]A = \Big[\; T(\mathbf{e}_1) \;\; T(\mathbf{e}_2) \;\; \cdots \;\; T(\mathbf{e}_n) \;\Big]

증명. x=∑jxjej\mathbf{x} = \sum_j x_j\mathbf{e}_j이므로 선형성에 의해 T(x)=∑jxjT(ej)T(\mathbf{x}) = \sum_j x_j T(\mathbf{e}_j)이고, 이것은 열이 T(ej)T(\mathbf{e}_j)인 행렬과 x\mathbf{x}의 곱의 정의(다음 절의 열 그림) 그 자체다. 거꾸로 어떤 행렬 AA든 x↦Ax\mathbf{x}\mapsto A\mathbf{x}는 선형이다(분배법칙). 유일성: Ax=BxA\mathbf{x} = B\mathbf{x}가 모든 x\mathbf{x}에서 성립하면 x=ej\mathbf{x}=\mathbf{e}_j를 넣어 두 행렬의 jj열이 같다. ∎

그러니 "선형 변환"과 "행렬"은 같은 대상의 두 이름입니다. 행렬은 기저 벡터가 어디로 가는지 적어 둔 기록이고, MathBook의 격자를 휘는 기계가 바로 이 정리를 그림으로 보여 줍니다. 여기서는 한 걸음 더 나가 정의 자체를 시험해 봅시다.

SIMULATOR

선형성 검사기: 더하고 보내기 = 보내고 더하기?

u, v를 끌어 보세요
T(u)T(v)T(u + v)T(u) + T(v) 끝점(고리)입력 u, v
—
‖T(u+v) − T(u) − T(v)‖—
‖T(cu) − c·T(u)‖—
T(0)—
해볼 것: ① '평행이동'을 고르면 T(0) ≠ 0이고, 파란 화살표 끝과 주황 고리가 늘 (1, 0.5)만큼 어긋납니다. ② '성분 제곱'에서 u, v를 모두 제1사분면에 두면 차이가 2(u₁v₁, u₂v₂)로 나타납니다. 격자의 상이 휘는 것도 보세요. ③ '절댓값'은 u, v가 모두 제1사분면에 있을 때 우연히 가법성을 통과합니다. 한 점만 통과해서는 선형이 아닙니다. 정의는 "모든" u, v, c에 대한 요구입니다. 모델: 오차가 10⁻⁹ 미만이면 같다고 판정합니다.
예제 2.1 · 변환의 행렬 구하기 평면에서 "직선 y=xy=x에 대한 반사 후, 가로 방향으로 3배 늘이기"의 행렬을 구하라.

풀이. e1=(1,0)\mathbf{e}_1=(1,0)은 반사로 (0,1)(0,1)이 되고 가로 늘이기는 xx성분만 바꾸므로 그대로 (0,1)(0,1). e2=(0,1)\mathbf{e}_2=(0,1)은 반사로 (1,0)(1,0), 늘이기로 (3,0)(3,0). 두 결과를 열로 세우면

A=[0310],A[25]=2[01]+5[30]=[152].A = \begin{bmatrix}0 & 3\\ 1 & 0\end{bmatrix}, \qquad A\begin{bmatrix}2\\5\end{bmatrix} = 2\begin{bmatrix}0\\1\end{bmatrix} + 5\begin{bmatrix}3\\0\end{bmatrix} = \begin{bmatrix}15\\2\end{bmatrix}.

확인: 점 (2,5)(2,5)를 반사하면 (5,2)(5,2), 가로 3배면 (15,2)(15,2). 공식 없이 "기저가 가는 곳"만으로 끝났다.

"직선을 직선으로 보낸다"만으로는 부족하다 평행이동도 직선을 직선으로 보내지만 원점을 움직이므로 선형이 아닙니다. 이런 변환(선형 변환 + 평행이동)을 아핀 변환(affine transformation)이라 하고, 7절에서 동차 좌표로 행렬 곱 안에 넣습니다.

Ax의 두 그림: 열의 결합과 행과의 내적

같은 곱셈, 다른 질문

공장에서 제품 1, 2를 각각 x1x_1, x2x_2개 만든다고 합시다. 제품 1 하나에는 철 1kg과 전력 3kWh, 제품 2 하나에는 철 2kg이 들고 대신 폐열 회수로 전력 1kWh가 돌아옵니다. 총 철 소비와 총 전력 소비는? 이 질문은 "제품별 자원 벡터를 생산량만큼 더하기"로도, "자원별로 생산량과의 내적 구하기"로도 답할 수 있습니다. 두 계산은 같은 숫자를 내지만 서로 다른 것을 보여 줍니다.

m×nm\times n 행렬 AA와 x∈Rn\mathbf{x}\in\mathbb{R}^n의 곱 Ax∈RmA\mathbf{x}\in\mathbb{R}^m은 두 가지로 계산됩니다. 열을 a1,…,an\mathbf{a}_1,\dots,\mathbf{a}_n, 행을 r1T,…,rmT\mathbf{r}_1^\mathsf{T},\dots,\mathbf{r}_m^\mathsf{T}라 하면

Ax=x1a1+x2a2+⋯+xnan⏟열 그림: 열의 선형 결합(Ax)i=ri⋅x=∑jaijxj⏟행 그림: 행과의 내적\underbrace{A\mathbf{x} = x_1\mathbf{a}_1 + x_2\mathbf{a}_2 + \cdots + x_n\mathbf{a}_n}_{\text{열 그림: 열의 선형 결합}} \qquad\qquad \underbrace{(A\mathbf{x})_i = \mathbf{r}_i\cdot\mathbf{x} = \sum_{j} a_{ij}x_j}_{\text{행 그림: 행과의 내적}}
크기 규칙: (m×n)(m\times n)과 (n×1)(n\times 1)의 곱은 (m×1)(m\times 1). 안쪽 차원 nn이 같아야 한다. 열 그림은 출력 공간 Rm\mathbb{R}^m에서, 행 그림은 입력 공간 Rn\mathbb{R}^n에서 그린다.
a₁ = (1, 3) a₂ = (2, −1) 2a₁ Ax = 2a₁ + 1a₂ = (4, 5) 열 그림 (출력 공간) x = (2, 1) r₁·x = x₁ + 2x₂ = 4 r₂·x = 3x₁ − x₂ = 5 r₁ r₂ 행 그림 (입력 공간)
그림 2-2. A=[123−1]A = \begin{bmatrix}1 & 2\\ 3 & -1\end{bmatrix}, x=(2,1)\mathbf{x} = (2, 1). 왼쪽: 열 a₁을 2번, a₂를 1번 이어 붙이면 Ax = (4, 5)에 닿는다. 오른쪽: 출력의 i번째 성분은 행 rᵢ와 x의 내적이다. "rᵢ·z = 그 값"인 점 z들은 rᵢ에 수직인 직선을 이루고, x는 두 직선의 교점이다. 이 그림이 3장의 연립방정식으로 이어진다.

열 그림은 "어떤 출력이 가능한가"에 답하기 좋습니다. AxA\mathbf{x}는 언제나 열들의 선형 결합이므로, 가능한 출력 전체는 열들이 생성하는 공간(5장의 열공간)입니다. 행 그림은 "출력의 각 성분이 입력의 무엇을 재는가"에 답합니다. ii번째 출력은 입력을 행 ri\mathbf{r}_i 방향으로 잰 값(에 ∥ri∥\|\mathbf{r}_i\|를 곱한 것)입니다. 신경망 층의 각 뉴런, 센서 배열의 각 측정, 회계의 각 계정 합계가 행 그림입니다.

SIMULATOR

같은 곱, 두 그림: 열 그림 ↔ 행 그림

점 x를 끌어 보세요
행렬 A
보기
—
x—
열 그림: x₁a₁ + x₂a₂—
행 그림: (r₁·x, r₂·x)—
해볼 것: ① 열 그림에서 x를 끌면 x₁a₁(보라)과 x₂a₂(청록)가 꼬리를 물고 Ax에 닿습니다. x₁을 음수로 만들면 a₁ 반대 방향으로 갑니다. ② 행 그림으로 바꾸면 같은 x를 지나는 두 직선이 보입니다. 직선을 따라 x를 끌면 그 행의 출력은 변하지 않습니다. ③ 행렬을 [1 2; 2 4]로 바꾸면 두 열이 한 직선 위에 놓여, x를 어디로 끌어도 Ax는 그 직선을 벗어나지 못합니다. 모델: 입력 x(점)와 출력 Ax를 같은 좌표평면에 함께 그렸습니다.
예제 2.2 · 3×3을 두 방법으로 A=[201−130014]A = \begin{bmatrix}2 & 0 & 1\\ -1 & 3 & 0\\ 0 & 1 & 4\end{bmatrix}, x=(1,2,−1)\mathbf{x} = (1, 2, -1)일 때 AxA\mathbf{x}를 구하라.

열 그림. 1⋅(2,−1,0)+2⋅(0,3,1)+(−1)⋅(1,0,4)=(2−1,  −1+6,  2−4)=(1,5,−2)1\cdot(2,-1,0) + 2\cdot(0,3,1) + (-1)\cdot(1,0,4) = (2-1,\; -1+6,\; 2-4) = (1, 5, -2).

행 그림. (2,0,1)⋅x=2+0−1=1(2,0,1)\cdot\mathbf{x} = 2+0-1 = 1, (−1,3,0)⋅x=−1+6=5(-1,3,0)\cdot\mathbf{x} = -1+6 = 5, (0,1,4)⋅x=2−4=−2(0,1,4)\cdot\mathbf{x} = 2-4 = -2. 같은 9번의 곱셈과 6번의 덧셈을 순서만 바꿔 한 것이다. 컴퓨터에서는 이 순서가 메모리 접근 패턴을 바꾸어 속도 차이를 낸다(8절).

행렬 곱을 계산하는 네 가지 방법

"행 곱하기 열"은 왜 그렇게 생겼나

행렬 곱 C=ABC = AB의 성분 공식 cij=∑kaikbkjc_{ij} = \sum_k a_{ik}b_{kj}는 보통 규칙으로 외웁니다. 그런데 같은 곱을 열 단위, 행 단위, 심지어 "열 곱하기 행"의 합으로도 계산할 수 있고, 각 방법이 서로 다른 응용의 언어가 됩니다. 규칙은 하나가 아니라 넷입니다.

먼저 정의부터. BB의 열을 b1,…,bp\mathbf{b}_1,\dots,\mathbf{b}_p라 할 때 ABAB는 "먼저 BB, 다음 AA"인 합성 변환의 행렬입니다. 정리 2.2에 따라 그 jj열은 ej\mathbf{e}_j가 최종적으로 가는 곳 A(Bej)=AbjA(B\mathbf{e}_j) = A\mathbf{b}_j입니다. 이 한 줄에서 네 가지 계산법이 모두 나옵니다.

정리 2.3 (행렬 곱의 네 얼굴) AA가 m×nm\times n, BB가 n×pn\times p이면 C=ABC=AB는 m×pm\times p이고 다음 넷은 모두 같다.
① 성분: cij=ri⋅bj=∑k=1naikbkj② 열: C=[ Ab1  ⋯  Abp ]\text{① 성분: } c_{ij} = \mathbf{r}_i\cdot\mathbf{b}_j = \sum_{k=1}^{n} a_{ik}b_{kj} \qquad \text{② 열: } C = \big[\,A\mathbf{b}_1 \;\cdots\; A\mathbf{b}_p\,\big] ③ 행: (C의 i행)=riTB④ 외적의 합: C=∑k=1nak βkT\text{③ 행: } (C\text{의 } i\text{행}) = \mathbf{r}_i^\mathsf{T}B \qquad \text{④ 외적의 합: } C = \sum_{k=1}^{n} \mathbf{a}_k\,\boldsymbol\beta_k^\mathsf{T}
여기서 riT\mathbf{r}_i^\mathsf{T}는 AA의 ii행, ak\mathbf{a}_k는 AA의 kk열, βkT\boldsymbol\beta_k^\mathsf{T}는 BB의 kk행이다. ④의 각 항 akβkT\mathbf{a}_k\boldsymbol\beta_k^\mathsf{T}는 m×pm\times p 행렬이고 계수가 1이다(모든 열이 ak\mathbf{a}_k의 배수).
① 성분×=ABCc₂₃ = (2행)·(3열)② 열×=ABCC의 1열 = A·b₁③ 행×=ABCC의 1행 = (A의 1행)·B④ 외적의 합×=ABCC = Σ (k열)(k행)
그림 2-3. 같은 곱 C = AB의 네 가지 읽기. 색칠한 칸이 한 번에 쓰는 재료와 만들어지는 결과다. ① 행 하나와 열 하나로 성분 하나, ② A 전체와 B의 열 하나로 C의 열 하나, ③ A의 행 하나와 B 전체로 C의 행 하나, ④ A의 열 하나와 B의 행 하나로 C 전체 크기의 계수 1 행렬 하나를 만들어 n개를 더한다.

네 방법은 쓰임이 다릅니다. ②는 "BB의 각 열에 같은 변환 AA를 적용"하므로 정점 수천 개를 한 행렬의 열로 모아 한 번에 변환하는 그래픽스와 같습니다. ③은 데이터의 각 행(표본 하나)에 같은 가중치를 곱하는 신경망의 일괄 처리입니다. ④는 계수 1 조각의 합이라는 관점으로, 14장의 SVD와 저랭크 근사가 정확히 이 꼴 A=∑σkukvkTA = \sum \sigma_k\mathbf{u}_k\mathbf{v}_k^\mathsf{T}입니다.

SIMULATOR

한 단계씩 곱하기: 성분 · 열 · 행 · 외적

A (2×3)
×
B (3×2)
=
C = AB (2×2)
계산 방법
—
진행—
지금까지 곱셈 횟수—
완성된 C—
해볼 것: ① 네 방법 모두 끝까지 진행해 C가 같은지, 곱셈 횟수가 모두 2·3·2 = 12인지 확인하세요. ② ④ 외적 방법에서 한 단계 뒤의 C는 계수 1 행렬입니다(두 행이 서로 배수). 세 조각을 더해야 일반적인 C가 됩니다. ③ '새 행렬'을 눌러 다른 정수 행렬로 연습하세요. 모델: 정수 성분 2×3 · 3×2 곱.
예제 2.3 · 외적의 합으로 [1234][5678]\begin{bmatrix}1 & 2\\ 3 & 4\end{bmatrix}\begin{bmatrix}5 & 6\\ 7 & 8\end{bmatrix}을 ④로 계산하라.
[13][56]+[24][78]=[561518]+[14162832]=[19224350]\begin{bmatrix}1\\3\end{bmatrix}\begin{bmatrix}5 & 6\end{bmatrix} + \begin{bmatrix}2\\4\end{bmatrix}\begin{bmatrix}7 & 8\end{bmatrix} = \begin{bmatrix}5 & 6\\ 15 & 18\end{bmatrix} + \begin{bmatrix}14 & 16\\ 28 & 32\end{bmatrix} = \begin{bmatrix}19 & 22\\ 43 & 50\end{bmatrix}

①로 확인하면 c11=1⋅5+2⋅7=19c_{11} = 1\cdot5+2\cdot7 = 19, c22=3⋅6+4⋅8=50c_{22} = 3\cdot6+4\cdot8 = 50. 같다.

곱은 합성이다: 결합법칙과 순서

세 변환을 미리 합치면 어느 쪽부터 곱해도 되나

정점 백만 개에 모델 행렬 MM, 뷰 행렬 VV, 투영 행렬 PP를 차례로 적용한다고 합시다. 정점마다 P(V(Mx))P(V(M\mathbf{x}))를 계산하면 행렬–벡터 곱이 정점당 세 번입니다. 미리 PVMPVM을 만들어 두면 한 번이죠. 그런데 (PV)M(PV)M과 P(VM)P(VM)은 같을까요? 그리고 MVPMVP처럼 순서를 바꾸면?

정리 2.4 (결합법칙) 크기가 맞으면 (AB)C=A(BC)(AB)C = A(BC).

증명. 두 행렬이 같은 함수임을 보이면 된다(정리 2.2의 유일성). 임의의 x\mathbf{x}에 대해 ((AB)C)x=(AB)(Cx)=A(B(Cx))((AB)C)\mathbf{x} = (AB)(C\mathbf{x}) = A(B(C\mathbf{x}))이고 (A(BC))x=A((BC)x)=A(B(Cx))(A(BC))\mathbf{x} = A((BC)\mathbf{x}) = A(B(C\mathbf{x})). 둘 다 "C, 다음 B, 다음 A"다. 성분 계산 ∑k∑laikbklclj\sum_k\sum_l a_{ik}b_{kl}c_{lj}으로 해도 되지만, 함수 합성의 결합법칙을 빌리면 한 줄이다. ∎

그래서 괄호는 자유롭게 옮길 수 있습니다. 하지만 순서는 바꿀 수 없습니다. ABAB는 "먼저 BB"이고 BABA는 "먼저 AA"입니다. 양말을 신고 신발을 신는 것과 신발을 신고 양말을 신는 것이 다르듯, 일반적으로 AB≠BAAB\ne BA입니다. 크기조차 안 맞을 수 있고(2×32\times3과 3×53\times 5), 맞아도 결과가 다릅니다.

[1101]⏟전단 S[0−110]⏟90∘ 회전 R=[1−110]  ≠  [0−111]=RS\underbrace{\begin{bmatrix}1 & 1\\ 0 & 1\end{bmatrix}}_{\text{전단 }S}\underbrace{\begin{bmatrix}0 & -1\\ 1 & 0\end{bmatrix}}_{90^\circ\text{ 회전 }R} = \begin{bmatrix}1 & -1\\ 1 & 0\end{bmatrix} \;\ne\; \begin{bmatrix}0 & -1\\ 1 & 1\end{bmatrix} = RS
SRe1SR\mathbf{e}_1: 먼저 돌려서 (0,1)(0,1), 그다음 전단으로 (1,1)(1,1). RSe1RS\mathbf{e}_1: 전단은 e1\mathbf{e}_1을 그대로 두고, 돌려서 (0,1)(0,1). 첫 열부터 다르다.
SIMULATOR

합성 실험실: BA(먼저 A)와 AB(먼저 B)

BA: 먼저 A → 다음 B
AB: 먼저 B → 다음 A
BA—
AB—
교환자 AB − BA—
해볼 것: ① A = 90° 회전, B = 가로 전단에서 두 F가 다른 곳에 도착하는 것을 보세요(점선은 반대편 결과). ② B를 '1.5배 확대'로 바꾸면 교환자가 0이 됩니다. 스칼라 배 행렬은 무엇과도 교환됩니다. ③ A = 45° 회전, B = 30° 회전처럼 같은 종류의 회전끼리는 교환됩니다(각이 더해질 뿐). ④ A = x축 사영, B = y축 사영이면 AB = BA = 0입니다. 영행렬이 아닌 두 행렬의 곱이 0일 수 있습니다. 모델: 회전은 각도를, 나머지는 성분을 단위 행렬에서 선형 보간해 중간 단계를 그렸습니다.

시뮬레이터의 ④가 보여 주듯 행렬 곱은 실수 곱과 다른 점이 더 있습니다. AB=0AB = 0이어도 A=0A=0이나 B=0B=0이라는 보장이 없고, 따라서 AB=ACAB = AC에서 AA를 "약분"해 B=CB=C라고 할 수도 없습니다(AA가 역행렬을 가질 때만 가능, 4장). 반면 다음은 실수처럼 성립합니다.

법칙식성립?이유
결합법칙(AB)C=A(BC)(AB)C = A(BC)항상함수 합성의 결합법칙
분배법칙A(B+C)=AB+ACA(B+C) = AB+AC항상AA가 선형
단위원ImA=A=AInI_mA = A = AI_n항상"아무것도 안 하기"
교환법칙AB=BAAB = BA일반적으로 아님합성 순서가 다르다
소거법칙AB=AC⇒B=CAB = AC \Rightarrow B = C일반적으로 아님AA가 정보를 지울 수 있다
거듭제곱ApAq=Ap+qA^pA^q = A^{p+q}항상같은 변환끼리는 교환
연산 순서는 결과가 아니라 비용을 바꾼다 (AB)x(AB)\mathbf{x}와 A(Bx)A(B\mathbf{x})는 같은 벡터지만 비용이 다릅니다. n×nn\times n 행렬이면 앞쪽은 행렬 곱(≈2n3\approx 2n^3 연산) 뒤 행렬–벡터 곱, 뒤쪽은 행렬–벡터 곱 두 번(≈4n2\approx 4n^2)입니다. n=1000n = 1000이면 20억 대 400만입니다. 같은 변환을 벡터 백만 개에 적용할 때는 반대로 미리 곱해 두는 쪽이 이깁니다. 결합법칙은 이런 최적화를 허락해 주는 정리입니다.

전치: 행과 열을 바꾸면 내적이 반대편으로 건너간다

출력에서 잰 값을 입력에서 재려면

로봇 팔 끝에 힘 센서가 있습니다. 관절 각속도 θ˙\dot{\boldsymbol\theta}가 끝점 속도 v=Jθ˙\mathbf{v} = J\dot{\boldsymbol\theta}를 만든다고 할 때(JJ는 야코비 행렬), 끝점에 힘 f\mathbf{f}가 걸리면 각 관절 모터는 얼마의 토크를 버텨야 할까요? 일률 f⋅v\mathbf{f}\cdot\mathbf{v}는 관절 쪽에서 계산해도 같아야 합니다. 이 "같은 내적을 반대편에서 재기"가 전치입니다.

m×nm\times n 행렬 AA의 전치(transpose) ATA^\mathsf{T}는 n×mn\times m 행렬로 (AT)ij=aji(A^\mathsf{T})_{ij} = a_{ji}입니다. 행이 열이 되고 열이 행이 됩니다. 열벡터 x\mathbf{x}의 전치 xT\mathbf{x}^\mathsf{T}는 행벡터이고, 내적은 x⋅y=xTy\mathbf{x}\cdot\mathbf{y} = \mathbf{x}^\mathsf{T}\mathbf{y}라는 행렬 곱이 됩니다.

정리 2.5 (전치의 성질)
(AT)T=A,(A+B)T=AT+BT,(AB)T=BTAT,(Ax)⋅y=x⋅(ATy)(A^\mathsf{T})^\mathsf{T} = A, \qquad (A+B)^\mathsf{T} = A^\mathsf{T}+B^\mathsf{T}, \qquad (AB)^\mathsf{T} = B^\mathsf{T}A^\mathsf{T}, \qquad (A\mathbf{x})\cdot\mathbf{y} = \mathbf{x}\cdot(A^\mathsf{T}\mathbf{y})

증명(곱). ((AB)T)ij=(AB)ji=∑kajkbki=∑k(BT)ik(AT)kj=(BTAT)ij((AB)^\mathsf{T})_{ij} = (AB)_{ji} = \sum_k a_{jk}b_{ki} = \sum_k (B^\mathsf{T})_{ik}(A^\mathsf{T})_{kj} = (B^\mathsf{T}A^\mathsf{T})_{ij}. 마지막 성질은 (Ax)Ty=xTATy(A\mathbf{x})^\mathsf{T}\mathbf{y} = \mathbf{x}^\mathsf{T}A^\mathsf{T}\mathbf{y}로 곱의 전치를 적용한 것이다. 순서가 뒤집히는 이유는 양말과 신발과 같다. 벗을 때는 신발부터 벗는다. ∎

로봇 팔 문제의 답이 마지막 성질입니다. f⋅(Jθ˙)=(JTf)⋅θ˙\mathbf{f}\cdot(J\dot{\boldsymbol\theta}) = (J^\mathsf{T}\mathbf{f})\cdot\dot{\boldsymbol\theta}이므로 관절 토크는 τ=JTf\boldsymbol\tau = J^\mathsf{T}\mathbf{f}입니다. 속도를 앞으로 보내는 행렬이 JJ라면 힘을 뒤로 보내는 행렬은 JTJ^\mathsf{T}입니다. 신경망의 역전파에서 기울기가 가중치 행렬의 전치를 타고 거꾸로 흐르는 것도 정확히 같은 구조입니다.

예제 2.4 · ATAA^\mathsf{T}A는 언제나 대칭 임의의 m×nm\times n 행렬 AA에 대해 ATAA^\mathsf{T}A는 n×nn\times n 대칭 행렬이고, 대각 성분은 음수가 아니다.

풀이. (ATA)T=AT(AT)T=ATA(A^\mathsf{T}A)^\mathsf{T} = A^\mathsf{T}(A^\mathsf{T})^\mathsf{T} = A^\mathsf{T}A. 성분으로 보면 (ATA)ij=ai⋅aj(A^\mathsf{T}A)_{ij} = \mathbf{a}_i\cdot\mathbf{a}_j(열끼리의 내적)이므로 대칭이고, 대각 성분 ai⋅ai=∥ai∥2≥0\mathbf{a}_i\cdot\mathbf{a}_i = \|\mathbf{a}_i\|^2 \ge 0이다. 예: A=[120110]A = \begin{bmatrix}1 & 2\\ 0 & 1\\ 1 & 0\end{bmatrix}이면 ATA=[2225]A^\mathsf{T}A = \begin{bmatrix}2 & 2\\ 2 & 5\end{bmatrix}. 이 행렬(그람 행렬)은 8장 최소제곱의 정규 방정식 ATAx^=ATbA^\mathsf{T}A\hat{\mathbf{x}} = A^\mathsf{T}\mathbf{b}의 주인공이다.

특수 행렬: 모양이 성질을 말한다

백만 × 백만 행렬을 저장할 수 있을까

원소가 101210^{12}개면 배정밀도로 8테라바이트입니다. 그런데 회로 시뮬레이션이나 구조 해석에서 나오는 큰 행렬은 대부분의 칸이 0이거나, 대각선 근처에만 값이 있거나, 위아래가 대칭입니다. 행렬의 모양을 알면 저장도 계산도 수천 배 줄어듭니다. 그리고 모양은 대개 물리적 성질(국소성, 상호성, 보존)에서 옵니다.

대각D위삼각U아래삼각L치환P대칭Aᵀ = A삼중대각띠 행렬
그림 2-4. 6×6 행렬에서 0이 아닐 수 있는 칸(색칠)의 모양. 대칭 행렬은 대각선을 사이에 두고 같은 색끼리 값이 같다. 삼중대각(띠) 행렬은 1차원 열전도·스프링 사슬·전송선처럼 "이웃끼리만 상호작용"하는 계에서 나온다.
이름정의변환으로서의 뜻핵심 성질
대각 행렬i≠ji\ne j이면 aij=0a_{ij}=0축마다 따로 늘이기곱·거듭제곱이 성분별: Dk=diag⁡(dik)D^k = \operatorname{diag}(d_i^k)
위(아래)삼각 행렬i>ji>j (i<ji\lt j)이면 aij=0a_{ij}=0xnx_n은 xnx_n에만, … 순차 의존삼각끼리의 곱은 삼각. 후진 대입으로 바로 푼다(3장)
치환 행렬II의 행 순서를 바꾼 것좌표 이름 바꾸기PT=P−1P^\mathsf{T} = P^{-1}. 행 교환(3장)의 기록
대칭 행렬AT=AA^\mathsf{T} = A서로 수직인 축을 따라 늘이기실수 고유값, 직교 고유벡터(13장)
직교 행렬QTQ=IQ^\mathsf{T}Q = I회전·반사(길이 보존)Q−1=QTQ^{-1} = Q^\mathsf{T}, ∥Qx∥=∥x∥\|Q\mathbf{x}\| = \|\mathbf{x}\| (9장)
사영 행렬P2=PP^2 = P한 번 그림자를 내리면 끝직교 사영이면 추가로 PT=PP^\mathsf{T}=P (8장)
멱영 행렬어떤 kk에서 Nk=0N^k = 0몇 번 적용하면 모두 소멸대각 성분이 0인 순삼각 행렬이 대표 예

직교 행렬의 정의 QTQ=IQ^\mathsf{T}Q = I를 성분으로 읽으면 "열끼리의 내적이 i=ji=j면 1, 아니면 0", 즉 열들이 서로 수직인 단위 벡터라는 뜻입니다. 길이 보존은 전치 성질 한 줄로 나옵니다. ∥Qx∥2=(Qx)⋅(Qx)=x⋅(QTQx)=∥x∥2\|Q\mathbf{x}\|^2 = (Q\mathbf{x})\cdot(Q\mathbf{x}) = \mathbf{x}\cdot(Q^\mathsf{T}Q\mathbf{x}) = \|\mathbf{x}\|^2.

SIMULATOR

특수 행렬 도감: 모양과 성질 확인하기

종류
—
A—
Aᵀ—
det A—
성질—
해볼 것: ① '대칭'에서 점선 두 축(서로 수직)은 방향이 바뀌지 않고 늘거나 줄기만 합니다. 단위원은 그 축에 맞춘 타원이 됩니다. ② '사영'에 'A² 겹쳐 보기'를 켜면 A²의 상이 A의 상과 정확히 겹칩니다(P² = P). ③ '멱영'은 한 번이면 평면이 직선으로, 두 번이면 원점 하나로 무너집니다. ④ '회전'과 '반사'는 단위원을 단위원으로 보냅니다(직교). 반사는 F를 거울상으로 뒤집습니다(det = −1). 모델: 2×2 행렬. 점선 원은 단위원, 실선은 그 상입니다.

2차원에서 본 성질은 3차원에서도 그대로입니다. 3×3 회전 행렬은 세 좌표축 회전 Rx,Ry,RzR_x, R_y, R_z의 곱으로 만들 수 있고, 곱의 순서에 따라 결과가 달라집니다(비행기의 요·피치·롤 순서 규약이 중요한 이유). 회전 뒤에 크기 조절·전단·사영을 붙이면 단위 정육면체는 평행육면체로 바뀌고, 그 부피 배율이 3×3 행렬식입니다(10장).

Rz(γ)=[cos⁡γ−sin⁡γ0sin⁡γcos⁡γ0001],Ry(β)=[cos⁡β0sin⁡β010−sin⁡β0cos⁡β],Rx(α)=[1000cos⁡α−sin⁡α0sin⁡αcos⁡α]R_z(\gamma) = \begin{bmatrix}\cos\gamma & -\sin\gamma & 0\\ \sin\gamma & \cos\gamma & 0\\ 0 & 0 & 1\end{bmatrix},\quad R_y(\beta) = \begin{bmatrix}\cos\beta & 0 & \sin\beta\\ 0 & 1 & 0\\ -\sin\beta & 0 & \cos\beta\end{bmatrix},\quad R_x(\alpha) = \begin{bmatrix}1 & 0 & 0\\ 0 & \cos\alpha & -\sin\alpha\\ 0 & \sin\alpha & \cos\alpha\end{bmatrix}
각 행렬의 열은 세 축 단위 벡터가 가는 곳이다. 예를 들어 RzR_z는 e3\mathbf{e}_3(z축)을 그대로 두므로 3열이 (0,0,1)(0,0,1)이다. 세 행렬 모두 직교 행렬이고 det = 1이다.
SIMULATOR

3×3 행렬로 정육면체 돌리고 찌그러뜨리기

순서
Me₁Me₂Me₃원래 정육면체
M = RzRyRx 와 S의 곱—
det M (부피 배율)—
MᵀM = I ? (직교)—
해볼 것: ① S = 없음일 때 어떤 각도에서도 MᵀM = I, det = 1입니다. 회전은 모양을 바꾸지 않습니다. ② '전단'을 고르고 순서를 바꿔 보세요. 같은 R과 S인데 정육면체가 다른 평행육면체가 됩니다. ③ '사영'은 순서와 상관없이 det = 0입니다. 부피가 사라지면 3차원 정보가 하나 사라진 것입니다. 모델: 3×3 선형 변환을 고정된 관찰 방향에서 정사영으로 그렸습니다(원근 없음). 회전 순서는 x → y → z (M = RzRyRx).

동차 좌표: 평행이동까지 행렬 곱으로

로봇 팔 끝은 어디에 있나

평면 로봇 팔의 첫 관절이 θ1\theta_1 돌고, 길이 L1L_1인 첫 팔 끝에서 둘째 관절이 θ2\theta_2 돌고, 길이 L2L_2인 둘째 팔 끝에 집게가 있습니다. 집게의 위치와 방향은? 관절이 여섯 개인 산업용 로봇이라면? 회전과 이동이 번갈아 나오는데, 이동은 선형이 아니라서(원점을 옮김) 행렬 곱의 사슬로 쓸 수 없습니다. 이대로라면 단계마다 "돌리고 더하기"를 손으로 이어 붙여야 합니다.

요령은 차원을 하나 올리는 것입니다. 평면의 점 (x,y)(x, y)를 3차원 벡터 (x,y,1)(x, y, 1)로 씁니다. 그러면 평행이동이 3×3 행렬 곱이 됩니다.

[10tx01ty001][xy1]=[x+txy+ty1],[At0T1][x1]=[Ax+t1]\begin{bmatrix}1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1\end{bmatrix}\begin{bmatrix}x\\ y\\ 1\end{bmatrix} = \begin{bmatrix}x+t_x\\ y+t_y\\ 1\end{bmatrix}, \qquad \begin{bmatrix}A & \mathbf{t}\\ \mathbf{0}^\mathsf{T} & 1\end{bmatrix}\begin{bmatrix}\mathbf{x}\\ 1\end{bmatrix} = \begin{bmatrix}A\mathbf{x}+\mathbf{t}\\ 1\end{bmatrix}
3차원 공간에서 보면 이 행렬은 평면 z=1z=1을 미끄러뜨리는 전단, 즉 진짜 선형 변환이다. 평면 위에서는 그것이 평행이동으로 보일 뿐이다. 오른쪽은 일반 아핀 변환 x↦Ax+t\mathbf{x}\mapsto A\mathbf{x}+\mathbf{t}의 블록 표기(8절).

이렇게 쓰면 아핀 변환의 합성도 행렬 곱이 되고, 결합법칙과 "오른쪽이 먼저" 규칙이 그대로 적용됩니다. 3차원 그래픽스는 같은 방식으로 (x,y,z,1)(x,y,z,1)과 4×4 행렬을 씁니다. 원근 투영은 마지막 성분 ww에 깊이를 실어 보낸 뒤 화면에서 (x/w,y/w)(x/w, y/w)로 나누는 방식으로 처리합니다.

모델 좌표캐릭터 기준 M 세계 좌표장면 기준 V 카메라 좌표눈 기준 P 클립 좌표(x, y, z, w) ÷w 화면픽셀 위치 정점마다: clip = (P·V·M) · [x y z 1]ᵀ — 세 4×4 행렬은 프레임마다 한 번 미리 곱한다 M·V: 회전·이동(아핀), P: 원근 투영(마지막 행이 w에 깊이를 싣는다). 나눗셈 ÷w만 행렬 곱 밖에 있다.
그림 2-5. 실시간 그래픽스의 정점 변환 사슬. 각 화살표가 4×4 동차 행렬이고, 오른쪽에 쓴 행렬이 먼저 적용되므로 식은 P·V·M 순서다. 원근 나눗셈(÷w)만 선형이 아니다.
SIMULATOR

2관절 로봇 팔: 동차 행렬의 사슬

받침(사각 점)을 끌 수 있습니다
한 마디의 행렬
—
T₀₁ (첫 마디)—
T₁₂ (둘째 마디)—
T₀₂ = T₀₁T₁₂—
집게 위치—
해볼 것: ① T₀₂의 왼쪽 위 2×2 블록이 각 θ₁ + θ₂ 회전이고, 오른쪽 열이 집게 위치(받침 기준)인지 확인하세요. ② '뒤바뀜'을 고르면 "먼저 회전, 그다음 이동"이 되어 θ₁을 바꿔도 첫 관절이 제자리에서 돌기만 하고 팔은 늘 가로로 뻗습니다. 회전 중심이 틀린 것입니다. ③ 받침을 끌면 전체 사슬 앞에 평행이동 행렬 하나가 곱해질 뿐, T₀₂는 그대로입니다. 모델: 평면 2자유도 직렬 팔, 각 마디 T = R(θ)·Tr(L, 0), 집게 모양은 끝 좌표계에서 그린 도형을 전체 행렬로 옮긴 것입니다.
예제 2.5 · 강체 변환의 역 T=[Rt0T1]T = \begin{bmatrix}R & \mathbf{t}\\ \mathbf{0}^\mathsf{T} & 1\end{bmatrix}(RR은 회전)의 역행렬을 구하라.

풀이. y=Rx+t\mathbf{y} = R\mathbf{x}+\mathbf{t}를 x\mathbf{x}에 대해 풀면 x=R−1(y−t)=RTy−RTt\mathbf{x} = R^{-1}(\mathbf{y}-\mathbf{t}) = R^\mathsf{T}\mathbf{y} - R^\mathsf{T}\mathbf{t}(회전은 직교 행렬이므로 R−1=RTR^{-1}=R^\mathsf{T}). 따라서

T−1=[RT−RTt0T1].T^{-1} = \begin{bmatrix}R^\mathsf{T} & -R^\mathsf{T}\mathbf{t}\\ \mathbf{0}^\mathsf{T} & 1\end{bmatrix}.

카메라의 위치·자세 TT를 알 때 뷰 행렬 V=T−1V = T^{-1}을 역행렬 계산 없이 전치와 곱 하나로 얻는 공식이다.

블록 행렬과 계산 비용: GPU가 행렬 곱을 사랑하는 이유

계산보다 운반이 비싸다

4096×40964096\times 4096 행렬 두 개를 곱하는 데는 약 1,370억 번의 부동소수점 연산이 필요합니다. 그런데 현대의 프로세서에서 숫자 하나를 메모리에서 가져오는 시간은 곱셈 한 번보다 훨씬 깁니다. 곱셈마다 재료를 새로 가져온다면 계산 장치는 대부분 놀고 있겠지요. 어떻게 하면 한 번 가져온 숫자로 여러 번 계산할 수 있을까요?

먼저 셈입니다. n×nn\times n 행렬 곱에서 성분 하나는 곱셈 nn번, 덧셈 n−1n-1번이고 성분이 n2n^2개이므로 모두 n2(2n−1)≈2n3n^2(2n-1)\approx 2n^3 연산입니다. 반면 재료(두 행렬)는 2n22n^2개뿐입니다. 숫자 하나당 평균 nn번 쓰이는 셈이라, 재사용만 잘하면 메모리 이동은 거의 무시할 수 있습니다. 그 재사용을 조직하는 도구가 블록 행렬입니다.

정리 2.6 (블록 곱) 행렬을 크기가 맞는 블록으로 나누면 블록을 성분처럼 곱해도 된다.
[A11A12A21A22][B11B12B21B22]=[A11B11+A12B21A11B12+A12B22A21B11+A22B21A21B12+A22B22]\begin{bmatrix}A_{11} & A_{12}\\ A_{21} & A_{22}\end{bmatrix}\begin{bmatrix}B_{11} & B_{12}\\ B_{21} & B_{22}\end{bmatrix} = \begin{bmatrix}A_{11}B_{11}+A_{12}B_{21} & A_{11}B_{12}+A_{12}B_{22}\\ A_{21}B_{11}+A_{22}B_{21} & A_{21}B_{12}+A_{22}B_{22}\end{bmatrix}
조건은 AA의 열 분할과 BB의 행 분할이 일치하는 것뿐이다(그래야 AikBkjA_{ik}B_{kj}의 크기가 맞는다). 증명은 성분 합 ∑kaikbkj\sum_k a_{ik}b_{kj}를 블록 경계에서 끊어 묶는 것이다. 블록 곱에서는 A12B21≠B21A12A_{12}B_{21}\ne B_{21}A_{12}이므로 순서를 지켜야 한다.
C₂₃ = A₂₁B₁₃ + A₂₂B₂₃ + A₂₃B₃₃ + A₂₄B₄₃A (행 블록 2)×B (열 블록 3)=C (블록 2,3)빠른 메모리 한 번에A 타일 b×b + B 타일 b×b= 2b² 개 숫자→ 2b³ 연산
그림 2-6. 타일(블록) 곱. C의 한 타일을 만들려면 A의 같은 줄 타일들과 B의 같은 열 타일들을 차례로 곱해 더한다. 크기 b×b인 타일 두 개를 빠른 메모리에 올리면 2b²개의 숫자로 2b³번 계산하므로, 숫자 하나가 b번 재사용된다.

타일 크기 bb가 클수록 재사용이 늘어납니다. 이 "연산 수 ÷ 옮긴 바이트 수"를 산술 강도(arithmetic intensity)라 하고, 기계의 최고 연산 속도와 메모리 대역폭의 비보다 산술 강도가 낮으면 계산은 메모리에 묶이고, 높으면 연산에 묶입니다(루프라인 모델). 행렬 곱은 타일만 잘 짜면 산술 강도를 얼마든지 올릴 수 있는 드문 계산이라, 수천 개의 연산 장치를 가진 GPU의 성능을 거의 다 뽑아낼 수 있습니다. 행렬–벡터 곱은 그렇지 않습니다. 행렬의 숫자 하나가 딱 한 번만 쓰이기 때문입니다.

SIMULATOR

루프라인: 행렬 곱은 연산에, 행렬–벡터 곱은 메모리에 묶인다

계산
타일 크기 b
연산 수—
메모리 이동 (추정)—
산술 강도—
예상 시간 · 한계—
해볼 것: ① 타일 1(재사용 없음)에서는 행렬 곱도 메모리 한계에 걸립니다. 타일을 키우면 점이 오른쪽으로 이동해 지붕(최고 연산 속도)에 닿습니다. ② '행렬 × 벡터'는 타일을 아무리 키워도 산술 강도가 약 0.5에 머뭅니다. ③ n을 두 배로 하면 행렬 곱의 연산 수는 8배, 행렬–벡터 곱은 4배가 됩니다. 모델: 최고 연산 속도 20 TFLOP/s, 메모리 대역폭 1 TB/s인 가상의 가속기, 단정밀도(4바이트). 타일 곱의 메모리 이동은 2n³/b + 2n²개 숫자로 근사했고, 캐시 크기 제한·실제 하드웨어 효율은 무시했습니다.
2n³보다 빠를 수 있나 1969년 슈트라센은 2×2 블록 곱을 곱셈 8번이 아니라 7번으로 하는 방법을 찾았고, 이를 재귀적으로 쓰면 연산량이 O(nlog⁡27)≈O(n2.807)O(n^{\log_2 7})\approx O(n^{2.807})이 됩니다. 이후 지수는 이론적으로 2.4 아래까지 내려갔지만, 상수가 크거나 수치 안정성이 나빠 실무 라이브러리는 대부분 2n32n^3 알고리즘을 타일링과 하드웨어 최적화로 다듬어 씁니다.

이 도구가 쓰이는 곳

"변환 = 행렬, 합성 = 곱"은 이 서가와 시리즈 곳곳에서 계산의 기본 단위입니다.

핵심 정리

  1. 선형 변환은 T(au+bv)=aT(u)+bT(v)T(a\mathbf{u}+b\mathbf{v}) = aT(\mathbf{u})+bT(\mathbf{v})를 만족하는 함수다. T(0)=0T(\mathbf{0})=\mathbf{0}이 필요조건이므로 평행이동은 선형이 아니다(아핀).
  2. Rn→Rm\mathbb{R}^n\to\mathbb{R}^m의 선형 변환은 꼭 하나의 m×nm\times n 행렬과 같고, 그 jj열은 T(ej)T(\mathbf{e}_j)다. 행렬은 기저가 가는 곳의 기록이다.
  3. AxA\mathbf{x}는 열의 선형 결합(출력 공간의 그림)이자 행과의 내적(입력 공간의 그림)이다.
  4. 행렬 곱 ABAB의 jj열은 AbjA\mathbf{b}_j. 성분·열·행·외적의 합 네 방법이 모두 같고, 외적의 합은 계수 1 행렬들의 합이라는 관점을 준다.
  5. 곱 = 합성(오른쪽이 먼저). 그래서 결합법칙·분배법칙은 성립하지만 교환법칙·소거법칙은 일반적으로 성립하지 않는다.
  6. (AB)T=BTAT(AB)^\mathsf{T} = B^\mathsf{T}A^\mathsf{T}, Ax⋅y=x⋅ATyA\mathbf{x}\cdot\mathbf{y} = \mathbf{x}\cdot A^\mathsf{T}\mathbf{y}. ATAA^\mathsf{T}A는 언제나 대칭이다. 힘·기울기는 전치를 타고 거꾸로 흐른다.
  7. 대각·삼각·치환·대칭·직교(QTQ=IQ^\mathsf{T}Q=I)·사영(P2=PP^2=P)·멱영 행렬은 모양이 곧 성질이고, 앞으로 모든 분해(LU, QR, 고유값 분해, SVD)의 재료가 된다.
  8. 동차 좌표 (x,1)(\mathbf{x},1)로 아핀 변환이 행렬 곱이 된다. 그래픽스의 P·V·M, 로봇 팔의 관절 사슬이 이 구조다.
  9. n×nn\times n 행렬 곱은 약 2n32n^3 연산에 재료는 2n22n^2개. 블록(타일) 곱으로 재사용을 늘리면 연산에 묶이는 계산이 되어 GPU가 빛을 낸다.

확인 퀴즈

Q1. 다음 중 선형 변환인 것은?

(3y,x−y)=[031−1][xy](3y, x-y) = \begin{bmatrix}0 & 3\\ 1 & -1\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}로 행렬 곱이므로 선형이다. 첫째는 T(0) = (1, 0) ≠ 0, 둘째는 T(2u) ≠ 2T(u)(xy가 4배), 넷째는 T(−u) ≠ −T(u)다.

Q2. 선형 변환 T:R2→R3T:\mathbb{R}^2\to\mathbb{R}^3이 T(e1)=(1,0,2)T(\mathbf{e}_1) = (1, 0, 2), T(e2)=(0,1,−1)T(\mathbf{e}_2) = (0, 1, -1)을 만족한다. T(3,−2)T(3, -2)는?

T(3,−2)=3T(e1)−2T(e2)=(3,0,6)+(0,−2,2)=(3,−2,8)T(3,-2) = 3T(\mathbf{e}_1) - 2T(\mathbf{e}_2) = (3, 0, 6) + (0, -2, 2) = (3, -2, 8). 기저의 상 두 개면 선형 변환이 완전히 정해진다(정리 2.2). 행렬은 3×2다.

Q3. AA가 3×4, BB가 4×2 행렬이다. 옳은 것은?

안쪽 차원(4 = 4)이 맞아 AB는 바깥 차원 3×2. BA는 4×2와 3×4라 안쪽(2 ≠ 3)이 안 맞는다. BTATB^\mathsf{T}A^\mathsf{T}는 2×4와 4×3의 곱으로 정의되고 (AB)T(AB)^\mathsf{T}와 같은 2×3 행렬이다.

Q4. 행렬 곱 C=ABC = AB를 "외적의 합" ∑kakβkT\sum_k \mathbf{a}_k\boldsymbol\beta_k^\mathsf{T}로 쓸 때, 각 항 akβkT\mathbf{a}_k\boldsymbol\beta_k^\mathsf{T}에 대한 옳은 설명은?

A의 k열(m×1)과 B의 k행(1×p)의 곱은 m×p 행렬이다. 모든 열이 ak\mathbf{a}_k의 배수라 계수가 1이다. 내적(행·열)은 성분 하나를 주는 ① 방법이다.

Q5. 정점에 "먼저 회전 R, 그다음 이동 T, 마지막으로 투영 P"를 적용하는 하나의 행렬은?

P(T(Rx))=(PTR)xP(T(R\mathbf{x})) = (PTR)\mathbf{x}. 오른쪽 행렬이 벡터에 가장 가까워 먼저 적용된다. 회전과 이동은 일반적으로 교환되지 않으므로 순서가 중요하다(로봇 팔 시뮬레이터의 '뒤바뀜').

Q6. (ABC)T(ABC)^\mathsf{T}와 같은 것은?

(ABC)T=((AB)C)T=CT(AB)T=CTBTAT(ABC)^\mathsf{T} = ((AB)C)^\mathsf{T} = C^\mathsf{T}(AB)^\mathsf{T} = C^\mathsf{T}B^\mathsf{T}A^\mathsf{T}. 전치는 순서를 뒤집는다.

Q7. 2×2 행렬 PP가 P2=PP^2 = P이고 P≠IP\ne I, P≠0P\ne 0이다. PP에 대해 반드시 옳은 것은?

det⁡(P)2=det⁡(P2)=det⁡P\det(P)^2 = \det(P^2) = \det P이므로 det는 0 또는 1. det = 1이면 역행렬이 있어 P=P−1P2=P−1P=IP = P^{-1}P^2 = P^{-1}P = I가 되어 모순이다. 그래서 det = 0이고 상은 직선이다(사영). 대칭은 직교 사영일 때만 성립한다. 예: [1100]\begin{bmatrix}1 & 1\\ 0 & 0\end{bmatrix}은 사영이지만 대칭이 아니다.

Q8. n×nn\times n 행렬 A,BA, B와 벡터 x\mathbf{x}가 있다. nn이 클 때 ABxAB\mathbf{x}를 가장 적은 연산으로 계산하는 방법은?

결합법칙으로 결과는 같다. 비용은 (AB)x ≈ 2n³ + 2n², A(Bx) ≈ 4n²로 차이가 크다. 다만 같은 AB를 수많은 벡터에 적용할 때는 미리 곱해 두는 편이 낫다.