Zen's Hermitage

[선형 대수 4] 행렬 심화 3

(Updated: 2026년 3월 22일)
linear-algebramath

여러 가지 관계를 행렬로 나타내기

행렬을 처음 배울 때는 보통 y=Axy = Ax처럼 벡터 하나를 다른 벡터로 보내는 규칙으로 접한다. 이때 행렬은 입력을 받아 출력을 만드는 선형 규칙이다. 그런데 실제로 다루는 관계는 이보다 조금 더 다양하다. 시간에 따라 값이 누적되는 수열, 미분으로 연결되는 함수, 좌표계를 바꾸는 규칙, 전치처럼 행과 열의 역할을 바꾸는 연산까지 모두 행렬의 언어로 정리할 수 있다.

중요한 점은, 겉으로 보기에는 복잡해 보여도 적당히 상태를 묶고, 적당한 기저를 고르고, 적당한 표현으로 옮기면 많은 관계가 결국 행렬을 곱하는 문제로 바뀐다는 것이다. 이 글에서는 그 흐름을 차근차근 정리해보려 한다.

고계 차분과 고계 미분

시간에 따라 변하는 양을 다룰 때, 우리는 흔히 지금 값이 이전 값들과 어떤 관계를 가지는가를 본다. 이때 가장 먼저 등장하는 것이 차분과 미분이다.

차분은 이산적인 변화량을 다룬다. 예를 들어 수열 x1,x2,x3,x_1, x_2, x_3, \dots가 있을 때, 1계 차분은 바로 이웃한 항의 차이이다.

Δxt=xtxt1\Delta x_t = x_t - x_{t-1}

이 값은 한 시점 전과 비교했을 때 얼마나 변했는가를 말해준다. 만약 이 차분에 다시 차분을 취하면 2계 차분이 된다.

Δ2xt=Δ(Δxt)=(xtxt1)(xt1xt2)=xt2xt1+xt2\begin{aligned} \Delta^2 x_t &= \Delta(\Delta x_t) \\ &= (x_t - x_{t-1}) - (x_{t-1} - x_{t-2}) \\ &= x_t - 2x_{t-1} + x_{t-2} \end{aligned}

이것은 단순한 증가량이 아니라 증가량 자체가 어떻게 변하는가를 보여준다. 자동차로 비유하면, 위치의 변화는 속도에 대응하고, 속도의 변화는 가속도에 대응한다. 차분은 이런 변화를 이산적인 시간축 위에서 보는 방식이다.

이제 다음과 같은 수열을 보자.

xt===0.7xt10.5xt2+0.2xt3+0.1xt4x_t === -0.7x_{t-1} -0.5x_{t-2} +0.2x_{t-3} +0.1x_{t-4}

이 식은 오늘의 상태는 어제, 2일 전, 3일 전, 4일 전 상태의 조합으로 결정된다는 뜻이다. 여기서 중요한 것은 xtx_t 하나가 독립적으로 생겨나는 것이 아니라, 과거의 여러 값이 함께 현재를 만든다는 점이다.

예를 들어 주가, 온도, 진동, 신호, 인구 변화 같은 현상을 생각해보면 이런 식이 자연스럽다. 오늘의 값은 갑자기 하늘에서 떨어지는 것이 아니라, 최근 며칠의 흐름을 이어받아 결정되는 경우가 많다. 위 식의 계수들은 각각의 과거가 오늘에 얼마나 영향을 미치는지를 나타낸다.

  • 0.7xt1-0.7x_{t-1}은 어제의 값이 꽤 큰 비중으로 영향을 준다는 뜻이다.
  • 0.5xt2-0.5x_{t-2}는 2일 전의 흔적도 아직 남아 있다는 뜻이다.
  • +0.2xt3+0.2x_{t-3}, +0.1xt4+0.1x_{t-4}는 더 오래된 과거도 약하게 작용한다는 뜻이다.

계수가 양수이면 같은 방향으로 밀고, 음수이면 반대 방향으로 끌어당긴다. 그래서 이 식은 단순히 이전 값을 더한다가 아니라, 과거 여러 시점이 서로 다른 부호와 크기로 현재를 만든다는 구조를 가진다.

그런데 이 식은 겉으로 보면 행렬 곱 하나로 바로 쓰기 어렵다. 왜냐하면 xtx_t는 하나의 수이고, 오른쪽에는 여러 시점의 값들이 섞여 있기 때문이다. 이럴 때는 상태를 크게 잡으면 된다.

다음과 같이 상태 벡터를 만든다.

st===[xtxt1xt2xt3]s_t === \begin{bmatrix} x_t \\ x_{t-1} \\ x_{t-2} \\ x_{t-3} \end{bmatrix}

그러면 다음 시점의 상태 st+1s_{t+1}

st+1=======[xt+1xtxt1xt2]s_{t+1} ======= \begin{bmatrix} x_{t+1} \\ x_t \\ x_{t-1} \\ x_{t-2} \end{bmatrix}

이고, 원래 점화식을 이용하면

xt+1=======0.7xt0.5xt1+0.2xt2+0.1xt3x_{t+1} ======= -0.7x_t -0.5x_{t-1} +0.2x_{t-2} +0.1x_{t-3}

이므로 전체는 하나의 행렬 곱으로 정리된다.

st+1=======[0.70.50.20.1100001000010]sts_{t+1} ======= \begin{bmatrix} -0.7 & -0.5 & 0.2 & 0.1 \\ 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} s_t

이제 관계가 아주 선명해진다. 과거 4개를 기억하는 시스템이 하나의 행렬로 표현된 것이다. 즉, 고계 차분 관계는 상태를 적절히 묶으면 1차 선형 시스템으로 바뀐다.

이 발상은 매우 중요하다. 복잡한 고계 관계를 직접 다루는 대신, 상태공간을 키워서 1차 행렬 시스템으로 바꾼다. 그러면 반복, 안정성, 고유값, 장기 거동 같은 문제를 모두 행렬의 언어로 볼 수 있다.

미분 형식도 행렬로 쓸 수 있다

이 생각은 연속적인 경우에도 그대로 이어진다. 예를 들어 어떤 함수 x(t)x(t)가 다음과 같은 미분방정식을 만족한다고 하자.

x(t)+3x(t)+2x(t)=0x''(t) + 3x'(t) + 2x(t) = 0

겉보기에는 2계 미분방정식이다. 그런데 상태를 다음처럼 잡으면

u(t)====[x(t)x(t)]u(t) ==== \begin{bmatrix} x(t) \\ x'(t) \end{bmatrix}

그 도함수는

u(t)=====[x(t)x(t)]u'(t) ===== \begin{bmatrix} x'(t) \\ x''(t) \end{bmatrix}

가 된다. 원래 방정식에서

x(t)=3x(t)2x(t)x''(t) = -3x'(t) - 2x(t)

이므로,

u(t)=====[0123]u(t)u'(t) ===== \begin{bmatrix} 0 & 1 \\ -2 & -3 \end{bmatrix} u(t)

가 된다.

즉, 고계 미분방정식도 상태를 묶으면 1계 벡터 미분방정식이 된다. 차분이든 미분이든 핵심은 같다. 복잡한 관계를 적절한 상태 벡터의 진화로 바꾸는 것이다.

다항식의 나눗셈과 선형 관계

행렬은 수열이나 미분만 다루는 도구가 아니다. 다항식의 세계에서도 중요한 역할을 한다. 특히 다항식의 나눗셈, 즉 제법을 볼 때 그렇다.

예를 들어 f(x)f(x)를 어떤 다항식 g(x)g(x)로 나눌 때,

f(x)=q(x)g(x)+r(x)f(x) = q(x)g(x) + r(x)

처럼 몫 q(x)q(x)와 나머지 r(x)r(x)를 구하는 과정이 있다. 이것이 다항식의 나눗셈이다. 정수의 나눗셈에서

17=53+217 = 5 \cdot 3 + 2

라고 쓰는 것과 구조가 같다. 다만 대상이 숫자가 아니라 다항식일 뿐이다.

다항식 공간에서 곱셈, 미분, 나눗셈의 일부 과정은 모두 선형 변환 또는 거의 선형 변환으로 볼 수 있다. 예를 들어 차수가 제한된 다항식 공간에서 xx를 곱하는 연산은 기저를 정하면 행렬로 쓸 수 있다.

기저를

1,x,x2,x31, x, x^2, x^3

로 잡아 보자. 그러면 xx를 곱하는 연산은

1x,xx2,x2x31 \mapsto x,\quad x \mapsto x^2,\quad x^2 \mapsto x^3

처럼 차수를 한 칸씩 올린다. 이런 관계는 기저에 대한 좌표로 쓰면 행렬이 된다. 즉, 다항식의 연산 역시 적절한 공간과 기저를 정하면 행렬의 언어로 옮길 수 있다.

y=Ax+by = Ax + b를 행렬 곱으로 바꾸기

행렬은 본질적으로 선형 변환을 나타낸다. 그래서 가장 전형적인 형태는

y=Axy = Ax

이다. 그런데 실제 문제에서는 다음과 같은 꼴이 자주 나온다.

y=Ax+by = Ax + b

이 식은 선형 변환에 상수항이 추가된 형태이다. 이런 변환을 보통 아핀 변환이라고 부른다. 문제는 +b+b 때문에 더 이상 순수한 행렬 곱 하나의 형태가 아니라는 점이다.

하지만 표현을 한 차원 키우면 다시 행렬 곱으로 돌아갈 수 있다. 아이디어는 아주 단순하다. 벡터 끝에 1을 하나 덧붙이는 것이다.

원래 xRnx \in \mathbb{R}^n라면 다음과 같이 확장한다.

x~=========[x1]\tilde{x} ========= \begin{bmatrix} x \\ 1 \end{bmatrix}

그리고 다음 블록 행렬을 생각한다.

A~=========[Ab01]\tilde{A} ========= \begin{bmatrix} A & b \\ 0 & 1 \end{bmatrix}

그러면

A~x~==================[Ab01][x1]=============[Ax+b1]\tilde{A}\tilde{x} ================== \begin{bmatrix} A & b \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ 1 \end{bmatrix} ============= \begin{bmatrix} Ax + b \\ 1 \end{bmatrix}

가 된다.

즉, 원래는 선형이 아니어서 행렬 곱 하나로 쓰기 어려웠던 규칙이, 한 차원을 늘린 공간에서는 다시 행렬 곱 하나가 된다. 컴퓨터 그래픽스에서 평행이동을 행렬로 다룰 수 있는 이유도 바로 이것이다. 원래 평행이동은 xx+bx \mapsto x+b라서 선형이 아니지만, 동차좌표를 쓰면 행렬 연산으로 바뀐다.

💡핵심 아이디어

행렬로 직접 쓰기 어려운 관계라도, 상태를 늘리거나 차원을 하나 추가하면 다시 행렬 곱의 형태로 정리되는 경우가 많다.

좌표 변환과 행렬

이제 행렬의 가장 중요한 쓰임새 중 하나인 좌표 변환으로 넘어가 보자. 벡터를 이야기할 때 잠시 봉인해두었던 것이 기저이다. 좌표 변환은 결국 같은 벡터를 다른 기저로 표현하는 일이다.

벡터 그 자체와 그 벡터를 표현하는 좌표는 다르다. 이 차이를 이해해야 좌표 변환이 왜 중요한지도 보인다.

같은 벡터인데 좌표는 달라질 수 있다

예를 들어 평면 위의 어떤 화살표를 생각하자. 이 화살표는 공간 속의 실제 대상이다. 그런데 그 화살표를 설명하는 숫자는 어떤 기저를 쓰느냐에 따라 달라진다.

기본 기저에서는

v=[21]v = \begin{bmatrix} 2 \\ 1 \end{bmatrix}

처럼 보일 수 있고, 다른 기저에서는

[v]B=================[ab][v]_{\mathcal{B}} ================= \begin{bmatrix} a \\ b \end{bmatrix}

처럼 다른 숫자로 표현될 수 있다. 숫자는 달라졌지만, 공간 속의 화살표 자체는 변하지 않는다.

이 관점이 중요한 이유는 분명하다. 어떤 문제는 기본 기저에서는 복잡해 보이지만, 적절한 기저를 고르면 훨씬 단순해진다.

예를 들어 어떤 선형 변환이 특정 두 방향으로는 그냥 늘리기만 한다고 하자. 기본 기저에서는 행렬이 복잡하게 보일 수 있지만, 그 특별한 방향들을 기저로 잡으면 행렬이 대각행렬에 가까운 단순한 형태가 된다. 그러면 계산도, 해석도 쉬워진다.

즉, 좋은 기저를 고른다는 것은 문제를 바꾸는 것이 아니라, 문제를 더 잘 보이게 만드는 것이다.

좌표 변환이 왜 문제를 쉽게 만드는가

원래의 기저에서는 하나의 변환이 뒤섞여 보일 수 있다. 회전, 늘림, 기울임이 한꺼번에 섞여 있으면 무엇이 본질인지 파악하기 어렵다. 하지만 문제의 성질에 맞는 기저를 고르면 그 변환이 단순한 모습으로 드러난다.

예를 들어 어떤 변환이 두 방향을 서로 섞지 않고 각 방향만 따로 늘린다면, 그 두 방향을 기저로 삼았을 때 행렬은

[λ100λ2]\begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix}

처럼 된다. 그러면 첫 번째 방향은 λ1\lambda_1배, 두 번째 방향은 λ2\lambda_2배라는 사실이 바로 보인다. 복잡한 행렬 원소를 외워서 계산하는 것보다 훨씬 직관적이다.

즉, 좌표 변환은 단순히 숫자를 바꿔 적는 기술이 아니라, 문제의 구조를 드러내기 위한 렌즈를 고르는 일이다.

좌표 변환을 행렬로 쓰기

이제 이 과정을 실제로 행렬로 써보자. 새 기저를

b1,b2,,bnb_1, b_2, \dots, b_n

라고 하자. 이 기저 벡터들을 열로 모은 행렬을

P=[b1b2bn]P = \begin{bmatrix} | & | & & | \\ b_1 & b_2 & \cdots & b_n \\ | & | & & | \end{bmatrix}

라고 두자.

새 기저에서의 좌표를 [v]B[v]_{\mathcal{B}}라고 하면, 원래 표준 좌표의 벡터 vv

v=P[v]Bv = P[v]_{\mathcal{B}}

가 된다. 왜냐하면 [v]B[v]_{\mathcal{B}}의 성분은 b1,,bnb_1, \dots, b_n를 얼마나 섞어서 vv를 만들 것인가를 뜻하기 때문이다.

반대로 원래 좌표에서 새 기저 좌표를 구하려면

[v]B=P1v[v]_{\mathcal{B}} = P^{-1}v

가 된다.

이제 어떤 선형 변환 TT가 표준기저에서 행렬 AA로 표현된다고 하자. 즉,

T(v)=AvT(v) = Av

이다. 그런데 이 변환을 새 기저에서 보고 싶다면 어떻게 될까? v=P[v]Bv = P[v]_{\mathcal{B}}를 대입하면

T(v)====A(P[v]B)T(v) ==== A(P[v]_{\mathcal{B}})

이고, 결과를 다시 새 기저 좌표로 바꾸면

[T(v)]B====================P1AP[v]B[T(v)]_{\mathcal{B}} ==================== P^{-1}AP[v]_{\mathcal{B}}

가 된다. 따라서 새 기저에서의 행렬은

AB=P1APA_{\mathcal{B}} = P^{-1}AP

이다.

이 식은 좌표 변환의 핵심 공식이다. 먼저 새 좌표를 원래 좌표로 바꾸고, 그다음 원래 변환을 적용하고, 마지막으로 다시 새 좌표로 돌아온다. 그래서 P1APP^{-1}AP가 나온다.

전치 행렬

이제 행렬 자체에 대한 연산 중 가장 기본적인 것 하나를 보자. 바로 전치 행렬이다.

행렬 A=(aij)A = (a_{ij})의 전치 행렬 ATA^T는 행과 열을 서로 바꾼 행렬이다. 즉,

(AT)ij=aji(A^T)*{ij} = a*{ji}

이다.

예를 들어

A=[123456]A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}

이면

AT=[142536]A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix}

이다.

전치는 겉보기에는 단순한 뒤집기처럼 보이지만, 사실 선형대수에서 매우 자주 등장한다. 특히 행벡터와 열벡터를 오갈 때, 내적을 쓸 때, 선형사상의 쌍대적 성질을 볼 때, 대칭성이나 직교성을 다룰 때 중심적인 역할을 한다.

왜 전치가 중요한가

벡터를 보통 열벡터로 쓴다고 하자.

x=[x1x2x3]x = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix}

그러면 그 전치는 행벡터이다.

xT=[x1x2x3]x^T = \begin{bmatrix} x_1 & x_2 & x_3 \end{bmatrix}

이제 두 벡터 x,yx, y의 내적은

xTyx^T y

로 쓸 수 있다. 즉, 전치는 행과 열의 역할을 바꾸어서 곱셈이 가능하게 만드는 장치이기도 하다.

또 선형 변환 AA에 대해

xT(Ay)=(ATx)Tyx^T(Ay) = (A^T x)^T y

라는 관계가 성립한다. 이 식은 전치가 단순한 모양 뒤집기가 아니라, 곱셈 구조와 깊게 연결되어 있음을 보여준다.

전치의 기본 성질

전치는 다음과 같은 성질을 가진다.

(AT)T=A(A^T)^T = A

즉, 두 번 전치하면 원래로 돌아온다.

(A+B)T=AT+BT(A+B)^T = A^T + B^T

즉, 전치는 덧셈과 잘 맞는다.

(cA)T=cAT(cA)^T = cA^T

스칼라배도 그대로 밖으로 나온다.

그리고 매우 중요한 성질이 하나 더 있다.

(AB)T=BTAT(AB)^T = B^T A^T

곱의 순서가 뒤집힌다는 점이 핵심이다. 이것은 많은 계산에서 반복해서 쓰인다.

예를 들어 xTATx^T A^T(Ax)T(Ax)^T와 같고, 이 때문에 이차형식

xTAxx^T A x

같은 표현도 자연스럽게 등장한다.

대칭행렬과 전치

어떤 행렬이

AT=AA^T = A

를 만족하면 대칭행렬이라고 한다. 이런 행렬은 주대각선을 기준으로 양쪽이 거울처럼 같다.

예를 들어

[2113]\begin{bmatrix} 2 & 1 \\ 1 & 3 \end{bmatrix}

는 대칭행렬이다.

대칭행렬은 실수 선형대수에서 매우 중요하다. 고유값이 실수이고, 서로 직교하는 고유벡터를 가질 수 있으며, 적절한 기저를 고르면 대각화가 잘 되는 좋은 성질을 갖는다. 그래서 좌표 변환과도 깊게 연결된다.

전치는 본질적으로 행과 열의 관계에 대한 이야기

전치를 제대로 이해하려면 행렬을 단순한 숫자표로만 보지 않는 것이 좋다. 행렬의 각 행은 출력 좌표를 만드는 규칙으로 볼 수 있고, 각 열은 입력 기저벡터가 어디로 가는지를 보여주는 정보로 볼 수 있다.

즉, 열 중심으로 보면 각 기저벡터의 상이 보이고, 행 중심으로 보면 각 출력 성분을 계산하는 법이 보인다. 전치는 이 두 관점을 서로 뒤집는다.

그래서 전치는 단순히 모양을 바꾸는 연산이 아니라, 입력과 출력의 역할, 행과 열의 역할, 열벡터 관점과 행벡터 관점을 맞바꾸는 연산이라고 보는 편이 더 본질에 가깝다.

복소행렬에서는 전치보다 켤레전치가 더 중요하다

실수 행렬에서는 전치 ATA^T가 자주 등장하지만, 복소수까지 가면 보통 전치만으로는 부족하다. 이때 더 중요한 것은 켤레전치이다.

복소수 z=a+biz = a + bi의 켤레복소수는

z=abi\overline{z} = a - bi

이다. 허수부의 부호만 바꾼 것이다. 복소행렬 AA에 대해 켤레전치는 각 원소를 켤레복소수로 바꾼 뒤 전치한 행렬이며, 보통

AA^*

또는

AA^\dagger

로 쓴다.

즉,

(A)ij=aji(A^*)*{ij} = \overline{a*{ji}}

이다.

예를 들어

A=[1+i23i4i]A = \begin{bmatrix} 1+i & 2 \\ 3i & 4-i \end{bmatrix}

이면

A===[1i3i24+i]A^* === \begin{bmatrix} 1-i & -3i \\ 2 & 4+i \end{bmatrix}

이다.

왜 굳이 전치가 아니라 켤레전치를 쓸까? 복소공간에서 내적을 정의할 때 켤레가 필요하기 때문이다. 보통 복소벡터 x,yx, y의 내적은

x,y=xy\langle x, y \rangle = x^* y

로 둔다. 그래야 길이와 직교 개념이 자연스럽게 유지된다. 만약 전치만 쓰면 복소수의 부호 구조 때문에 내적이 기대한 성질을 잃는다.

그래서 복소행렬에서는

  • 대칭행렬 대신 에르미트 행렬 A=AA^* = A
  • 직교행렬 대신 유니터리 행렬 AA=IA^*A = I

같은 개념이 중심이 된다.