1장에서 벡터를 더하고 늘이며 선형 결합을 만들었습니다. 이 장은 그 선형 결합을 통째로 실어 나르는 함수, 선형 변환을 다룹니다. 놀라운 사실은 유클리드 공간 사이의 선형 변환이 예외 없이 행렬 하나로 적힌다는 것입니다. 그러니 행렬은 숫자 표가 아니라 함수이고, 행렬–벡터 곱은 함수에 값을 넣는 일, 행렬 곱은 함수를 이어 붙이는 일, 전치는 내적을 반대편으로 옮기는 일입니다. 이 관점 하나로 곱셈 규칙이 왜 그렇게 생겼는지, 왜 AB=BA인지, 왜 게임 엔진은 3×3이 아니라 4×4 행렬을 쓰는지, 왜 GPU가 행렬 곱에 목숨을 거는지가 한 줄로 이어집니다.
선형성(가법성·동차성)을 정의대로 검사하고, 평행이동·제곱·절댓값이 왜 선형이 아닌지 설명한다.
Rn→Rm의 모든 선형 변환이 m×n 행렬이며 그 j열이 T(ej)임을 증명하고, 주어진 변환의 행렬을 직접 구한다.
Ax를 열 그림(열의 선형 결합)과 행 그림(행과의 내적)으로 모두 계산하고, 각 그림이 어떤 질문에 유리한지 안다.
행렬 곱을 성분·열·행·외적의 합 네 가지로 계산하고, 곱이 곧 합성임에서 결합법칙과 비가환성을 이끌어 낸다.
동차 좌표로 평행이동을 행렬 곱에 넣어 로봇 팔의 정기구학을 계산하고, 행렬 곱의 연산량 2n3과 메모리 이동이 성능을 정하는 이유를 설명한다.
이 수식이 없었다면실시간 3D 그래픽
게임 화면의 캐릭터는 수만 개에서 수백만 개의 꼭짓점(정점)으로 만든 다면체입니다. 매 프레임 이 정점들을 캐릭터 자신의 좌표에서 세계 좌표로, 세계에서 카메라 좌표로, 다시 원근 투영을 거쳐 화면 좌표로 옮겨야 합니다. 회전, 크기 조절, 이동, 투영을 정점마다 따로 공식으로 계산한다면 한 프레임에 해야 할 일이 감당할 수 없이 늘어납니다.
해법은 모든 단계를 4×4 행렬로 쓰고, 미리 곱해 행렬 하나로 합치는 것입니다. 정점 셰이더는 그 행렬 하나를 각 정점에 곱할 뿐입니다. 평행이동처럼 원래는 선형이 아닌 동작도 동차 좌표라는 요령으로 행렬 곱 안에 들어옵니다. 그래서 그래픽 하드웨어는 처음부터 "작은 행렬과 벡터를 엄청나게 많이 곱하는 기계"로 설계되었고, 같은 하드웨어가 오늘날 신경망의 거대한 행렬 곱을 맡고 있습니다.
정점마다 회전·이동·투영→공식이 단계마다 따로→변환 = 행렬, 합성 = 곱→정점당 4×4 곱 한 번
선형 변환: 선형 결합을 보존하는 함수
함수 하나를 알려면 입력을 몇 개나 넣어 봐야 할까
블랙박스 장치가 하나 있습니다. 2차원 벡터를 넣으면 2차원 벡터가 나옵니다. 장치의 동작을 완전히 알아내려면 평면의 모든 점(무한히 많은 점)을 넣어 봐야 할까요? 일반적인 함수라면 그렇습니다. 그런데 장치가 "입력을 더해서 넣으면 출력도 더해져서 나오고, 입력을 2배 하면 출력도 2배"라는 성질만 갖는다면 이야기가 완전히 달라집니다.
정의 2.1 (선형 변환) 함수 T:Rn→Rm이 모든 벡터 u,v와 모든 실수 c에 대해
T(u+v)=T(u)+T(v)(가법성),T(cu)=cT(u)(동차성)
를 만족하면 선형 변환(linear transformation, linear map)이라 한다. 두 조건을 합쳐 T(au+bv)=aT(u)+bT(v) 하나로 써도 같다. 즉 선형 결합을 넣으면 출력의 같은 선형 결합이 나온다.
정의에서 곧바로 나오는 사실 두 개가 검사에 유용합니다. 첫째, c=0을 넣으면 T(0)=0입니다. 원점을 움직이는 함수는 선형이 아닙니다. 둘째, 직선 p+td는 T(p)+tT(d)로 가므로 직선은 직선(또는 한 점)으로, 평행선은 평행선으로, 등간격 눈금은 등간격 눈금으로 갑니다. 격자가 휘지 않는다는 것이 선형 변환의 시각적 정의입니다.
그림 2-1. 가법성의 그림. 입력에서 u와 v로 만든 평행사변형의 대각선 u + v는, 선형 변환 뒤에도 T(u)와 T(v)로 만든 평행사변형의 대각선이 된다. "더하고 나서 보내기"와 "보내고 나서 더하기"가 같다는 뜻이다(여기서 T는 행렬 [1 −0.6; 0.4 1]).
이제 문제의 답입니다. 평면의 모든 벡터는 x=x1e1+x2e2로 쓸 수 있으므로, 선형이라면 T(x)=x1T(e1)+x2T(e2)입니다. 입력 두 개, e1과 e2만 넣어 보면 장치의 모든 것을 안다는 뜻입니다. 이것을 일반 차원에서 정리로 적으면 다음과 같습니다.
정리 2.2 (선형 변환의 표준 행렬)T:Rn→Rm이 선형이면 모든 x에 대해 T(x)=Ax인 m×n 행렬 A가 꼭 하나 있다. 그 행렬의 j열은 T(ej)이다.
A=[T(e1)T(e2)⋯T(en)]
증명.x=∑jxjej이므로 선형성에 의해 T(x)=∑jxjT(ej)이고, 이것은 열이 T(ej)인 행렬과 x의 곱의 정의(다음 절의 열 그림) 그 자체다. 거꾸로 어떤 행렬 A든 x↦Ax는 선형이다(분배법칙). 유일성: Ax=Bx가 모든 x에서 성립하면 x=ej를 넣어 두 행렬의 j열이 같다. ∎
그러니 "선형 변환"과 "행렬"은 같은 대상의 두 이름입니다. 행렬은 기저 벡터가 어디로 가는지 적어 둔 기록이고, 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=x에 대한 반사 후, 가로 방향으로 3배 늘이기"의 행렬을 구하라.
풀이.e1=(1,0)은 반사로 (0,1)이 되고 가로 늘이기는 x성분만 바꾸므로 그대로 (0,1). e2=(0,1)은 반사로 (1,0), 늘이기로 (3,0). 두 결과를 열로 세우면
A=[0130],A[25]=2[01]+5[30]=[152].
확인: 점 (2,5)를 반사하면 (5,2), 가로 3배면 (15,2). 공식 없이 "기저가 가는 곳"만으로 끝났다.
"직선을 직선으로 보낸다"만으로는 부족하다 평행이동도 직선을 직선으로 보내지만 원점을 움직이므로 선형이 아닙니다. 이런 변환(선형 변환 + 평행이동)을 아핀 변환(affine transformation)이라 하고, 7절에서 동차 좌표로 행렬 곱 안에 넣습니다.
Ax의 두 그림: 열의 결합과 행과의 내적
같은 곱셈, 다른 질문
공장에서 제품 1, 2를 각각 x1, x2개 만든다고 합시다. 제품 1 하나에는 철 1kg과 전력 3kWh, 제품 2 하나에는 철 2kg이 들고 대신 폐열 회수로 전력 1kWh가 돌아옵니다. 총 철 소비와 총 전력 소비는? 이 질문은 "제품별 자원 벡터를 생산량만큼 더하기"로도, "자원별로 생산량과의 내적 구하기"로도 답할 수 있습니다. 두 계산은 같은 숫자를 내지만 서로 다른 것을 보여 줍니다.
m×n 행렬 A와 x∈Rn의 곱 Ax∈Rm은 두 가지로 계산됩니다. 열을 a1,…,an, 행을 r1T,…,rmT라 하면
크기 규칙: (m×n)과 (n×1)의 곱은 (m×1). 안쪽 차원 n이 같아야 한다. 열 그림은 출력 공간 Rm에서, 행 그림은 입력 공간 Rn에서 그린다.
그림 2-2.A=[132−1], x=(2,1). 왼쪽: 열 a₁을 2번, a₂를 1번 이어 붙이면 Ax = (4, 5)에 닿는다. 오른쪽: 출력의 i번째 성분은 행 rᵢ와 x의 내적이다. "rᵢ·z = 그 값"인 점 z들은 rᵢ에 수직인 직선을 이루고, x는 두 직선의 교점이다. 이 그림이 3장의 연립방정식으로 이어진다.
열 그림은 "어떤 출력이 가능한가"에 답하기 좋습니다. Ax는 언제나 열들의 선형 결합이므로, 가능한 출력 전체는 열들이 생성하는 공간(5장의 열공간)입니다. 행 그림은 "출력의 각 성분이 입력의 무엇을 재는가"에 답합니다. i번째 출력은 입력을 행 ri 방향으로 잰 값(에 ∥ri∥를 곱한 것)입니다. 신경망 층의 각 뉴런, 센서 배열의 각 측정, 회계의 각 계정 합계가 행 그림입니다.
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=2−10031104, x=(1,2,−1)일 때 Ax를 구하라.
열 그림.1⋅(2,−1,0)+2⋅(0,3,1)+(−1)⋅(1,0,4)=(2−1,−1+6,2−4)=(1,5,−2).
행 그림.(2,0,1)⋅x=2+0−1=1, (−1,3,0)⋅x=−1+6=5, (0,1,4)⋅x=2−4=−2. 같은 9번의 곱셈과 6번의 덧셈을 순서만 바꿔 한 것이다. 컴퓨터에서는 이 순서가 메모리 접근 패턴을 바꾸어 속도 차이를 낸다(8절).
행렬 곱을 계산하는 네 가지 방법
"행 곱하기 열"은 왜 그렇게 생겼나
행렬 곱 C=AB의 성분 공식 cij=∑kaikbkj는 보통 규칙으로 외웁니다. 그런데 같은 곱을 열 단위, 행 단위, 심지어 "열 곱하기 행"의 합으로도 계산할 수 있고, 각 방법이 서로 다른 응용의 언어가 됩니다. 규칙은 하나가 아니라 넷입니다.
먼저 정의부터. B의 열을 b1,…,bp라 할 때 AB는 "먼저 B, 다음 A"인 합성 변환의 행렬입니다. 정리 2.2에 따라 그 j열은 ej가 최종적으로 가는 곳 A(Bej)=Abj입니다. 이 한 줄에서 네 가지 계산법이 모두 나옵니다.
정리 2.3 (행렬 곱의 네 얼굴)A가 m×n, B가 n×p이면 C=AB는 m×p이고 다음 넷은 모두 같다.
① 성분: cij=ri⋅bj=k=1∑naikbkj② 열: C=[Ab1⋯Abp]③ 행: (C의i행)=riTB④ 외적의합: C=k=1∑nakβkT
여기서 riT는 A의 i행, ak는 A의 k열, βkT는 B의 k행이다. ④의 각 항 akβkT는 m×p 행렬이고 계수가 1이다(모든 열이 ak의 배수).
그림 2-3. 같은 곱 C = AB의 네 가지 읽기. 색칠한 칸이 한 번에 쓰는 재료와 만들어지는 결과다. ① 행 하나와 열 하나로 성분 하나, ② A 전체와 B의 열 하나로 C의 열 하나, ③ A의 행 하나와 B 전체로 C의 행 하나, ④ A의 열 하나와 B의 행 하나로 C 전체 크기의 계수 1 행렬 하나를 만들어 n개를 더한다.
네 방법은 쓰임이 다릅니다. ②는 "B의 각 열에 같은 변환 A를 적용"하므로 정점 수천 개를 한 행렬의 열로 모아 한 번에 변환하는 그래픽스와 같습니다. ③은 데이터의 각 행(표본 하나)에 같은 가중치를 곱하는 신경망의 일괄 처리입니다. ④는 계수 1 조각의 합이라는 관점으로, 14장의 SVD와 저랭크 근사가 정확히 이 꼴 A=∑σkukvkT입니다.
SIMULATOR
한 단계씩 곱하기: 성분 · 열 · 행 · 외적
A (2×3)×B (3×2)=C = AB (2×2)
계산 방법
—
진행—
지금까지 곱셈 횟수—
완성된 C—
해볼 것: ① 네 방법 모두 끝까지 진행해 C가 같은지, 곱셈 횟수가 모두 2·3·2 = 12인지 확인하세요. ② ④ 외적 방법에서 한 단계 뒤의 C는 계수 1 행렬입니다(두 행이 서로 배수). 세 조각을 더해야 일반적인 C가 됩니다. ③ '새 행렬'을 눌러 다른 정수 행렬로 연습하세요. 모델: 정수 성분 2×3 · 3×2 곱.
정점 백만 개에 모델 행렬 M, 뷰 행렬 V, 투영 행렬 P를 차례로 적용한다고 합시다. 정점마다 P(V(Mx))를 계산하면 행렬–벡터 곱이 정점당 세 번입니다. 미리 PVM을 만들어 두면 한 번이죠. 그런데 (PV)M과 P(VM)은 같을까요? 그리고 MVP처럼 순서를 바꾸면?
정리 2.4 (결합법칙) 크기가 맞으면 (AB)C=A(BC).
증명. 두 행렬이 같은 함수임을 보이면 된다(정리 2.2의 유일성). 임의의 x에 대해 ((AB)C)x=(AB)(Cx)=A(B(Cx))이고 (A(BC))x=A((BC)x)=A(B(Cx)). 둘 다 "C, 다음 B, 다음 A"다. 성분 계산 ∑k∑laikbklclj으로 해도 되지만, 함수 합성의 결합법칙을 빌리면 한 줄이다. ∎
그래서 괄호는 자유롭게 옮길 수 있습니다. 하지만 순서는 바꿀 수 없습니다.AB는 "먼저 B"이고 BA는 "먼저 A"입니다. 양말을 신고 신발을 신는 것과 신발을 신고 양말을 신는 것이 다르듯, 일반적으로 AB=BA입니다. 크기조차 안 맞을 수 있고(2×3과 3×5), 맞아도 결과가 다릅니다.
SRe1: 먼저 돌려서 (0,1), 그다음 전단으로 (1,1). RSe1: 전단은 e1을 그대로 두고, 돌려서 (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=0이어도 A=0이나 B=0이라는 보장이 없고, 따라서 AB=AC에서 A를 "약분"해 B=C라고 할 수도 없습니다(A가 역행렬을 가질 때만 가능, 4장). 반면 다음은 실수처럼 성립합니다.
법칙
식
성립?
이유
결합법칙
(AB)C=A(BC)
항상
함수 합성의 결합법칙
분배법칙
A(B+C)=AB+AC
항상
A가 선형
단위원
ImA=A=AIn
항상
"아무것도 안 하기"
교환법칙
AB=BA
일반적으로 아님
합성 순서가 다르다
소거법칙
AB=AC⇒B=C
일반적으로 아님
A가 정보를 지울 수 있다
거듭제곱
ApAq=Ap+q
항상
같은 변환끼리는 교환
연산 순서는 결과가 아니라 비용을 바꾼다(AB)x와 A(Bx)는 같은 벡터지만 비용이 다릅니다. n×n 행렬이면 앞쪽은 행렬 곱(≈2n3 연산) 뒤 행렬–벡터 곱, 뒤쪽은 행렬–벡터 곱 두 번(≈4n2)입니다. n=1000이면 20억 대 400만입니다. 같은 변환을 벡터 백만 개에 적용할 때는 반대로 미리 곱해 두는 쪽이 이깁니다. 결합법칙은 이런 최적화를 허락해 주는 정리입니다.
전치: 행과 열을 바꾸면 내적이 반대편으로 건너간다
출력에서 잰 값을 입력에서 재려면
로봇 팔 끝에 힘 센서가 있습니다. 관절 각속도 θ˙가 끝점 속도 v=Jθ˙를 만든다고 할 때(J는 야코비 행렬), 끝점에 힘 f가 걸리면 각 관절 모터는 얼마의 토크를 버텨야 할까요? 일률 f⋅v는 관절 쪽에서 계산해도 같아야 합니다. 이 "같은 내적을 반대편에서 재기"가 전치입니다.
증명(곱).((AB)T)ij=(AB)ji=∑kajkbki=∑k(BT)ik(AT)kj=(BTAT)ij. 마지막 성질은 (Ax)Ty=xTATy로 곱의 전치를 적용한 것이다. 순서가 뒤집히는 이유는 양말과 신발과 같다. 벗을 때는 신발부터 벗는다. ∎
로봇 팔 문제의 답이 마지막 성질입니다. f⋅(Jθ˙)=(JTf)⋅θ˙이므로 관절 토크는 τ=JTf입니다. 속도를 앞으로 보내는 행렬이 J라면 힘을 뒤로 보내는 행렬은 JT입니다. 신경망의 역전파에서 기울기가 가중치 행렬의 전치를 타고 거꾸로 흐르는 것도 정확히 같은 구조입니다.
예제 2.4 · ATA는 언제나 대칭 임의의 m×n 행렬 A에 대해 ATA는 n×n 대칭 행렬이고, 대각 성분은 음수가 아니다.
풀이.(ATA)T=AT(AT)T=ATA. 성분으로 보면 (ATA)ij=ai⋅aj(열끼리의 내적)이므로 대칭이고, 대각 성분 ai⋅ai=∥ai∥2≥0이다. 예: A=101210이면 ATA=[2225]. 이 행렬(그람 행렬)은 8장 최소제곱의 정규 방정식 ATAx^=ATb의 주인공이다.
특수 행렬: 모양이 성질을 말한다
백만 × 백만 행렬을 저장할 수 있을까
원소가 1012개면 배정밀도로 8테라바이트입니다. 그런데 회로 시뮬레이션이나 구조 해석에서 나오는 큰 행렬은 대부분의 칸이 0이거나, 대각선 근처에만 값이 있거나, 위아래가 대칭입니다. 행렬의 모양을 알면 저장도 계산도 수천 배 줄어듭니다. 그리고 모양은 대개 물리적 성질(국소성, 상호성, 보존)에서 옵니다.
그림 2-4. 6×6 행렬에서 0이 아닐 수 있는 칸(색칠)의 모양. 대칭 행렬은 대각선을 사이에 두고 같은 색끼리 값이 같다. 삼중대각(띠) 행렬은 1차원 열전도·스프링 사슬·전송선처럼 "이웃끼리만 상호작용"하는 계에서 나온다.
이름
정의
변환으로서의 뜻
핵심 성질
대각 행렬
i=j이면 aij=0
축마다 따로 늘이기
곱·거듭제곱이 성분별: Dk=diag(dik)
위(아래)삼각 행렬
i>j (i<j)이면 aij=0
xn은 xn에만, … 순차 의존
삼각끼리의 곱은 삼각. 후진 대입으로 바로 푼다(3장)
치환 행렬
I의 행 순서를 바꾼 것
좌표 이름 바꾸기
PT=P−1. 행 교환(3장)의 기록
대칭 행렬
AT=A
서로 수직인 축을 따라 늘이기
실수 고유값, 직교 고유벡터(13장)
직교 행렬
QTQ=I
회전·반사(길이 보존)
Q−1=QT, ∥Qx∥=∥x∥ (9장)
사영 행렬
P2=P
한 번 그림자를 내리면 끝
직교 사영이면 추가로 PT=P (8장)
멱영 행렬
어떤 k에서 Nk=0
몇 번 적용하면 모두 소멸
대각 성분이 0인 순삼각 행렬이 대표 예
직교 행렬의 정의 QTQ=I를 성분으로 읽으면 "열끼리의 내적이 i=j면 1, 아니면 0", 즉 열들이 서로 수직인 단위 벡터라는 뜻입니다. 길이 보존은 전치 성질 한 줄로 나옵니다. ∥Qx∥2=(Qx)⋅(Qx)=x⋅(QTQx)=∥x∥2.
SIMULATOR
특수 행렬 도감: 모양과 성질 확인하기
종류
—
A—
Aᵀ—
det A—
성질—
해볼 것: ① '대칭'에서 점선 두 축(서로 수직)은 방향이 바뀌지 않고 늘거나 줄기만 합니다. 단위원은 그 축에 맞춘 타원이 됩니다. ② '사영'에 'A² 겹쳐 보기'를 켜면 A²의 상이 A의 상과 정확히 겹칩니다(P² = P). ③ '멱영'은 한 번이면 평면이 직선으로, 두 번이면 원점 하나로 무너집니다. ④ '회전'과 '반사'는 단위원을 단위원으로 보냅니다(직교). 반사는 F를 거울상으로 뒤집습니다(det = −1). 모델: 2×2 행렬. 점선 원은 단위원, 실선은 그 상입니다.
2차원에서 본 성질은 3차원에서도 그대로입니다. 3×3 회전 행렬은 세 좌표축 회전 Rx,Ry,Rz의 곱으로 만들 수 있고, 곱의 순서에 따라 결과가 달라집니다(비행기의 요·피치·롤 순서 규약이 중요한 이유). 회전 뒤에 크기 조절·전단·사영을 붙이면 단위 정육면체는 평행육면체로 바뀌고, 그 부피 배율이 3×3 행렬식입니다(10장).
각 행렬의 열은 세 축 단위 벡터가 가는 곳이다. 예를 들어 Rz는 e3(z축)을 그대로 두므로 3열이 (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 돌고, 길이 L1인 첫 팔 끝에서 둘째 관절이 θ2 돌고, 길이 L2인 둘째 팔 끝에 집게가 있습니다. 집게의 위치와 방향은? 관절이 여섯 개인 산업용 로봇이라면? 회전과 이동이 번갈아 나오는데, 이동은 선형이 아니라서(원점을 옮김) 행렬 곱의 사슬로 쓸 수 없습니다. 이대로라면 단계마다 "돌리고 더하기"를 손으로 이어 붙여야 합니다.
요령은 차원을 하나 올리는 것입니다. 평면의 점 (x,y)를 3차원 벡터 (x,y,1)로 씁니다. 그러면 평행이동이 3×3 행렬 곱이 됩니다.
3차원 공간에서 보면 이 행렬은 평면 z=1을 미끄러뜨리는 전단, 즉 진짜 선형 변환이다. 평면 위에서는 그것이 평행이동으로 보일 뿐이다. 오른쪽은 일반 아핀 변환 x↦Ax+t의 블록 표기(8절).
이렇게 쓰면 아핀 변환의 합성도 행렬 곱이 되고, 결합법칙과 "오른쪽이 먼저" 규칙이 그대로 적용됩니다. 3차원 그래픽스는 같은 방식으로 (x,y,z,1)과 4×4 행렬을 씁니다. 원근 투영은 마지막 성분 w에 깊이를 실어 보낸 뒤 화면에서 (x/w,y/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=[R0Tt1](R은 회전)의 역행렬을 구하라.
풀이.y=Rx+t를 x에 대해 풀면 x=R−1(y−t)=RTy−RTt(회전은 직교 행렬이므로 R−1=RT). 따라서
T−1=[RT0T−RTt1].
카메라의 위치·자세 T를 알 때 뷰 행렬 V=T−1을 역행렬 계산 없이 전치와 곱 하나로 얻는 공식이다.
블록 행렬과 계산 비용: GPU가 행렬 곱을 사랑하는 이유
계산보다 운반이 비싸다
4096×4096 행렬 두 개를 곱하는 데는 약 1,370억 번의 부동소수점 연산이 필요합니다. 그런데 현대의 프로세서에서 숫자 하나를 메모리에서 가져오는 시간은 곱셈 한 번보다 훨씬 깁니다. 곱셈마다 재료를 새로 가져온다면 계산 장치는 대부분 놀고 있겠지요. 어떻게 하면 한 번 가져온 숫자로 여러 번 계산할 수 있을까요?
먼저 셈입니다. n×n 행렬 곱에서 성분 하나는 곱셈 n번, 덧셈 n−1번이고 성분이 n2개이므로 모두 n2(2n−1)≈2n3 연산입니다. 반면 재료(두 행렬)는 2n2개뿐입니다. 숫자 하나당 평균 n번 쓰이는 셈이라, 재사용만 잘하면 메모리 이동은 거의 무시할 수 있습니다. 그 재사용을 조직하는 도구가 블록 행렬입니다.
정리 2.6 (블록 곱) 행렬을 크기가 맞는 블록으로 나누면 블록을 성분처럼 곱해도 된다.
조건은 A의 열 분할과 B의 행 분할이 일치하는 것뿐이다(그래야 AikBkj의 크기가 맞는다). 증명은 성분 합 ∑kaikbkj를 블록 경계에서 끊어 묶는 것이다. 블록 곱에서는 A12B21=B21A12이므로 순서를 지켜야 한다.
그림 2-6. 타일(블록) 곱. C의 한 타일을 만들려면 A의 같은 줄 타일들과 B의 같은 열 타일들을 차례로 곱해 더한다. 크기 b×b인 타일 두 개를 빠른 메모리에 올리면 2b²개의 숫자로 2b³번 계산하므로, 숫자 하나가 b번 재사용된다.
타일 크기 b가 클수록 재사용이 늘어납니다. 이 "연산 수 ÷ 옮긴 바이트 수"를 산술 강도(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(nlog27)≈O(n2.807)이 됩니다. 이후 지수는 이론적으로 2.4 아래까지 내려갔지만, 상수가 크거나 수치 안정성이 나빠 실무 라이브러리는 대부분 2n3 알고리즘을 타일링과 하드웨어 최적화로 다듬어 씁니다.
Q2. 선형 변환 T:R2→R3이 T(e1)=(1,0,2), T(e2)=(0,1,−1)을 만족한다. T(3,−2)는?
T(3,−2)=3T(e1)−2T(e2)=(3,0,6)+(0,−2,2)=(3,−2,8). 기저의 상 두 개면 선형 변환이 완전히 정해진다(정리 2.2). 행렬은 3×2다.
Q3. A가 3×4, B가 4×2 행렬이다. 옳은 것은?
안쪽 차원(4 = 4)이 맞아 AB는 바깥 차원 3×2. BA는 4×2와 3×4라 안쪽(2 ≠ 3)이 안 맞는다. BTAT는 2×4와 4×3의 곱으로 정의되고 (AB)T와 같은 2×3 행렬이다.
Q4. 행렬 곱 C=AB를 "외적의 합" ∑kakβkT로 쓸 때, 각 항 akβkT에 대한 옳은 설명은?
A의 k열(m×1)과 B의 k행(1×p)의 곱은 m×p 행렬이다. 모든 열이 ak의 배수라 계수가 1이다. 내적(행·열)은 성분 하나를 주는 ① 방법이다.
Q5. 정점에 "먼저 회전 R, 그다음 이동 T, 마지막으로 투영 P"를 적용하는 하나의 행렬은?
P(T(Rx))=(PTR)x. 오른쪽 행렬이 벡터에 가장 가까워 먼저 적용된다. 회전과 이동은 일반적으로 교환되지 않으므로 순서가 중요하다(로봇 팔 시뮬레이터의 '뒤바뀜').
Q6. (ABC)T와 같은 것은?
(ABC)T=((AB)C)T=CT(AB)T=CTBTAT. 전치는 순서를 뒤집는다.
Q7. 2×2 행렬 P가 P2=P이고 P=I, P=0이다. P에 대해 반드시 옳은 것은?
det(P)2=det(P2)=detP이므로 det는 0 또는 1. det = 1이면 역행렬이 있어 P=P−1P2=P−1P=I가 되어 모순이다. 그래서 det = 0이고 상은 직선이다(사영). 대칭은 직교 사영일 때만 성립한다. 예: [1010]은 사영이지만 대칭이 아니다.
Q8. n×n 행렬 A,B와 벡터 x가 있다. n이 클 때 ABx를 가장 적은 연산으로 계산하는 방법은?
결합법칙으로 결과는 같다. 비용은 (AB)x ≈ 2n³ + 2n², A(Bx) ≈ 4n²로 차이가 크다. 다만 같은 AB를 수많은 벡터에 적용할 때는 미리 곱해 두는 편이 낫다.