Zen's Hermitage

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

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

블록 대각 행렬

지금까지는 큰 행렬을 여러 블록으로 나누어 보고, 그 위에서 덧셈과 곱셈이 어떻게 보이는지를 살펴보았다. 이제 그중에서도 구조가 특히 선명한 형태 하나를 보자. 바로 블록 대각 행렬이다.

보통 대각행렬이라고 하면, 대각선 위에만 숫자가 있고 나머지는 모두 00인 행렬을 떠올린다. 블록 대각 행렬은 그 생각을 조금 확장한 것이다. 대각선 위에 숫자 하나 대신 작은 행렬 하나가 올라간다고 생각하면 된다.

블록으로 나눈 어떤 행렬에서, \ 방향의 대각선 위에 있는 블록들이 모두 정방행렬이고, 그 밖의 블록들이 전부 영행렬이면 그것을 블록 대각 행렬이라고 한다.

가장 전형적인 모양은 다음과 같다.

[A10000A20000A30000A4]\begin{bmatrix} A_1 & 0 & 0 & 0 \\ 0 & A_2 & 0 & 0 \\ 0 & 0 & A_3 & 0 \\ 0 & 0 & 0 & A_4 \end{bmatrix}

여기서 A1,A2,A3,A4A_1, A_2, A_3, A_4는 각각 정방행렬이다. 그리고 대각선 바깥에 있는 00들은 숫자 하나짜리 00이 아니라, 크기에 맞는 영행렬 블록이라고 이해해야 한다.

예를 들어 블록이 세 개인 블록 대각 행렬은 다음처럼 생길 수 있다.

[[1234][00][00][00][56][00][00][00][78]]\begin{bmatrix} \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} & \begin{bmatrix} 0 & 0 \end{bmatrix} & \begin{bmatrix} 0 & 0 \end{bmatrix} \\ \begin{bmatrix} 0 & 0 \end{bmatrix} & \begin{bmatrix} 5 & 6 \end{bmatrix} & \begin{bmatrix} 0 & 0 \end{bmatrix} \\ \begin{bmatrix} 0 & 0 \end{bmatrix} & \begin{bmatrix} 0 & 0 \end{bmatrix} & \begin{bmatrix} 7 & 8 \end{bmatrix} \end{bmatrix}

이 행렬에서는 첫 번째 블록, 두 번째 블록, 세 번째 블록만 살아 있고, 서로 다른 블록 사이를 연결하는 부분은 모두 00이다.

이런 행렬은 보통 다음처럼 간단히 쓴다.

diag(A1,A2,A3,A4)\mathrm{diag}(A_1, A_2, A_3, A_4)

즉,

diag(A1,A2,A3,A4)=[A10000A20000A30000A4]\mathrm{diag}(A_1, A_2, A_3, A_4) = \begin{bmatrix} A_1 & 0 & 0 & 0 \\ 0 & A_2 & 0 & 0 \\ 0 & 0 & A_3 & 0 \\ 0 & 0 & 0 & A_4 \end{bmatrix}

이다.

블록 대각 행렬이 나타내는 사상

블록 대각 행렬이 중요한 이유는 계산이 편하기 때문만은 아니다. 더 중요한 이유는, 이 행렬이 나타내는 사상의 의미가 매우 분명하기 때문이다.

행렬은 벡터를 다른 벡터로 보내는 규칙, 즉 사상이라고 볼 수 있다. 그런데 블록 대각 행렬은 그 변환이 한꺼번에 뒤섞여 일어나는 것이 아니라, 몇 개의 부분으로 나뉘어 독립적으로 일어나는 구조를 가진다.

가장 단순한 경우부터 보자.

D=[A100A2]D = \begin{bmatrix} A_1 & 0 \\ 0 & A_2 \end{bmatrix}

그리고 이 행렬이 작용하는 벡터를 두 부분으로 나누어

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

라고 쓰자. 여기서 x1x_1은 첫 번째 블록과 곱해지는 부분벡터이고, x2x_2는 두 번째 블록과 곱해지는 부분벡터이다.

그러면 곱 DxDx는 다음과 같다.

Dx=[A100A2][x1x2]=[A1x1A2x2]Dx = \begin{bmatrix} A_1 & 0 \\ 0 & A_2 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} A_1 x_1 \\ A_2 x_2 \end{bmatrix}

이 식이 말해 주는 바는 아주 크다.

첫 번째 결과를 만들 때는 A1x1A_1 x_1만 들어간다. 즉, 첫 번째 부분은 오직 첫 번째 블록과 첫 번째 부분벡터만으로 결정된다. 두 번째 부분도 마찬가지다. A2x2A_2 x_2만 들어간다.

즉,

  • 첫 번째 부분은 첫 번째 블록 안에서만 변환된다.
  • 두 번째 부분은 두 번째 블록 안에서만 변환된다.
  • 첫 번째 부분과 두 번째 부분은 서로 섞이지 않는다.

이것이 바로 “각 블록마다 독립적으로 변환된다”는 말의 정확한 뜻이다.

독립적으로 변환된다는 것을 더 쉽게 이해하기

이 말을 처음 들으면 조금 추상적으로 느껴질 수 있다. 그래서 더 쉬운 비유로 생각해보자.

큰 기계 하나가 있다고 하자. 그런데 그 기계 안에는 사실 서로 연결되지 않은 작은 기계 두 개가 들어 있다. 왼쪽 작은 기계는 왼쪽 재료만 처리하고, 오른쪽 작은 기계는 오른쪽 재료만 처리한다. 왼쪽 재료가 오른쪽 기계로 넘어가지 않고, 오른쪽 재료도 왼쪽 기계로 넘어가지 않는다.

블록 대각 행렬도 비슷하다. 큰 행렬 하나처럼 보이지만, 실제로는 작은 변환들이 서로 섞이지 않은 채 나란히 들어 있다.

예를 들어

D=[[1002][0000][0000][3004]]D = \begin{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 2 \end{bmatrix} & \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} \\ \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix} & \begin{bmatrix} 3 & 0 \\ 0 & 4 \end{bmatrix} \end{bmatrix}

를 보자.

그리고 벡터를 두 묶음으로 나누어

x=[[ab][cd]]x = \begin{bmatrix} \begin{bmatrix} a \\ b \end{bmatrix} \\ \begin{bmatrix} c \\ d \end{bmatrix} \end{bmatrix}

라고 하자.

그러면

Dx=[[1002][ab][3004][cd]]=[[a2b][3c4d]]Dx = \begin{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 2 \end{bmatrix} \begin{bmatrix} a \\ b \end{bmatrix} \\ \begin{bmatrix} 3 & 0 \\ 0 & 4 \end{bmatrix} \begin{bmatrix} c \\ d \end{bmatrix} \end{bmatrix} = \begin{bmatrix} \begin{bmatrix} a \\ 2b \end{bmatrix} \\ \begin{bmatrix} 3c \\ 4d \end{bmatrix} \end{bmatrix}

가 된다.

여기서 위쪽 계산은 a,ba, b만 보고 있고, 아래쪽 계산은 c,dc, d만 보고 있다. 위쪽 결과를 만들 때 c,dc, d는 전혀 등장하지 않는다. 아래쪽 결과를 만들 때도 a,ba, b는 전혀 등장하지 않는다.

즉, 위쪽 블록은 위쪽 부분만 바꾸고, 아래쪽 블록은 아래쪽 부분만 바꾼다. 서로 간섭하지 않는다.

이것이 블록 대각 행렬의 가장 중요한 직관이다.

일반식으로 보는 블록별 독립 변환

이제 이를 일반식으로 써 보자.

블록 대각 행렬

D=diag(A1,A2,,Am)D = \mathrm{diag}(A_1, A_2, \dots, A_m)

를 생각하고, 벡터를 이에 맞추어

x=[x1x2xm]x = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_m \end{bmatrix}

처럼 나누어 쓰자. 여기서 각 xix_iAiA_i와 곱할 수 있는 크기의 부분벡터이다.

그러면

Dx=[A1000A2000Am][x1x2xm]=[A1x1A2x2Amxm]Dx = \begin{bmatrix} A_1 & 0 & \cdots & 0 \\ 0 & A_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & A_m \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_m \end{bmatrix} = \begin{bmatrix} A_1 x_1 \\ A_2 x_2 \\ \vdots \\ A_m x_m \end{bmatrix}

가 된다.

이 식을 문장으로 풀면 다음과 같다.

  • 첫 번째 부분벡터 x1x_1에는 A1A_1만 작용한다.
  • 두 번째 부분벡터 x2x_2에는 A2A_2만 작용한다.
  • \dots
  • mm번째 부분벡터 xmx_m에는 AmA_m만 작용한다.

즉, 하나의 큰 변환이 사실은 여러 개의 작은 변환이 나란히 놓인 구조라는 뜻이다.

예시로 보는 블록별 독립 변환

다음 블록 대각 행렬을 보자.

D=diag([1101],[2])D = \mathrm{diag} \left( \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}, \begin{bmatrix} 2 \end{bmatrix} \right)

이것을 풀어 쓰면

D=[[1101][00][00][2]]D = \begin{bmatrix} \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} & \begin{bmatrix} 0 \\ 0 \end{bmatrix} \\ \begin{bmatrix} 0 & 0 \end{bmatrix} & \begin{bmatrix} 2 \end{bmatrix} \end{bmatrix}

이다.

이제 벡터를

x=[[uv][w]]x = \begin{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} \\ \begin{bmatrix} w \end{bmatrix} \end{bmatrix}

라고 하자.

그러면

Dx=[[1101][uv][2][w]]=[[u+vv][2w]]Dx = \begin{bmatrix} \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} \\ \begin{bmatrix} 2 \end{bmatrix} \begin{bmatrix} w \end{bmatrix} \end{bmatrix} = \begin{bmatrix} \begin{bmatrix} u + v \\ v \end{bmatrix} \\ \begin{bmatrix} 2w \end{bmatrix} \end{bmatrix}

가 된다.

이 결과를 보면, 앞의 22차원 부분은

[uv][u+vv]\begin{bmatrix} u \\ v \end{bmatrix} \mapsto \begin{bmatrix} u + v \\ v \end{bmatrix}

라는 규칙으로 변환되고, 뒤의 11차원 부분은

w2ww \mapsto 2w

라는 규칙으로 변환된다.

즉, 큰 행렬 하나가

  • 앞쪽 부분에 대한 변환 하나
  • 뒤쪽 부분에 대한 변환 하나

를 동시에 담고 있는 셈이다. 하지만 이 둘은 서로 섞이지 않는다.

블록 대각 행렬과 서브시스템

이제 이런 행렬이 왜 “독립된 서브시스템”을 나타낸다고 말하는지 이해할 수 있다.

블록 대각 행렬이 나타내는 전체 시스템은, 서로 영향을 주지 않는 여러 개의 작은 시스템으로 나누어진다.

예를 들어

D=diag(A1,A2)D = \mathrm{diag}(A_1, A_2)

일 때, 방정식

xt+1=Dxtx_{t+1} = D x_t

를 생각하자.

전체 상태벡터를

xt=[x1,tx2,t]x_t = \begin{bmatrix} x_{1,t} \\ x_{2,t} \end{bmatrix}

처럼 나누면,

xt+1===[x1,t+1x2,t+1]=[A1x1,tA2x2,t]x_{t+1} === \begin{bmatrix} x_{1,t+1} \\ x_{2,t+1} \end{bmatrix} = \begin{bmatrix} A_1 x_{1,t} \\ A_2 x_{2,t} \end{bmatrix}

이므로 결국 다음 두 식으로 분해된다.

x1,t+1=A1x1,tx_{1,t+1} = A_1 x_{1,t} x2,t+1=A2x2,tx_{2,t+1} = A_2 x_{2,t}

즉, 겉으로는 하나의 큰 시스템처럼 보였지만, 실제로는 두 개의 작은 시스템이 따로 돌아가고 있는 것이다.

더 일반적으로,

xt+1=diag(A1,A2,,Am)xtx_{t+1} = \mathrm{diag}(A_1, A_2, \dots, A_m)x_t

x1,t+1=A1x1,tx_{1,t+1} = A_1 x_{1,t} x2,t+1=A2x2,tx_{2,t+1} = A_2 x_{2,t} \vdots xm,t+1=Amxm,tx_{m,t+1} = A_m x_{m,t}

로 분해된다.

즉, 전체 시스템은 여러 개의 독립된 부분 시스템으로 나누어진다.

앞의 행렬은 독립된 서브시스템으로 분해된다

블록 대각 행렬이 주는 가장 큰 이점 중 하나는, 전체 시스템을 곧바로 여러 개의 독립된 서브시스템으로 읽어낼 수 있다는 점이다.

가장 단순하게 두 블록만 있는 경우부터 다시 보자.

D=[A100A2]D = \begin{bmatrix} A_1 & 0 \\ 0 & A_2 \end{bmatrix}

그리고 상태벡터를

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

라고 하면,

Dx=[A1x1A2x2]Dx = \begin{bmatrix} A_1 x_1 \\ A_2 x_2 \end{bmatrix}

이므로 전체 변환은 사실 다음 두 개의 변환으로 분해된다.

x1A1x1x_1 \mapsto A_1 x_1 x2A2x2x_2 \mapsto A_2 x_2

즉, 하나의 큰 사상처럼 보였지만 실제로는 두 개의 독립된 작은 사상이 나란히 있는 것이다.

예시

다음 블록 대각 행렬을 보자.

D=diag([1101],[0],[2])D = \mathrm{diag} \left( \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}, \begin{bmatrix} 0 \end{bmatrix}, \begin{bmatrix} 2 \end{bmatrix} \right)

상태벡터를

xt=[[ptqt][rt][st]]x_t = \begin{bmatrix} \begin{bmatrix} p_t \\ q_t \end{bmatrix} \\ \begin{bmatrix} r_t \end{bmatrix} \\ \begin{bmatrix} s_t \end{bmatrix} \end{bmatrix}

라고 두자.

그러면 전체 시스템

xt+1=Dxtx_{t+1} = D x_t

는 사실 세 개의 독립된 서브시스템으로 쪼개진다.

첫 번째 서브시스템은

[pt+1qt+1]=[1101][ptqt]\begin{bmatrix} p_{t+1} \\ q_{t+1} \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} p_t \\ q_t \end{bmatrix}

이다.

두 번째 서브시스템은

rt+1=0rt=0r_{t+1} = 0 \cdot r_t = 0

이다.

세 번째 서브시스템은

st+1=2sts_{t+1} = 2 s_t

이다.

즉, 큰 시스템 하나 안에 전혀 다른 세 가지 동작이 들어 있다.

  • 첫 번째 부분은 두 변수 pt,qtp_t, q_t가 함께 움직인다.
  • 두 번째 부분은 한 번 지나면 바로 00이 된다.
  • 세 번째 부분은 매 단계마다 두 배가 된다.

그런데 이 셋은 서로 영향을 주지 않는다. 그래서 각각을 따로 분석할 수 있다.

블록 대각 행렬의 거듭제곱

블록 대각 행렬은 거듭제곱을 계산할 때 특히 강력하다. 이유는 대각선 밖이 모두 00이기 때문에, 곱을 여러 번 해도 각 블록이 자기 자리 안에서만 계속 계산되기 때문이다.

가장 먼저 두 블록짜리 경우를 보자.

D=[A100A2]D = \begin{bmatrix} A_1 & 0 \\ 0 & A_2 \end{bmatrix}

그러면

D2=[A100A2][A100A2]=[A1200A22]D^2 = \begin{bmatrix} A_1 & 0 \\ 0 & A_2 \end{bmatrix} \begin{bmatrix} A_1 & 0 \\ 0 & A_2 \end{bmatrix} = \begin{bmatrix} A_1^2 & 0 \\ 0 & A_2^2 \end{bmatrix}

가 된다.

왜 그런지 한 칸씩 보면 더 잘 보인다.

왼쪽 위 블록은

A1A1+00=A12A_1 A_1 + 0 \cdot 0 = A_1^2

가 된다.

오른쪽 위 블록은

A10+0A2=0A_1 \cdot 0 + 0 \cdot A_2 = 0

가 된다.

왼쪽 아래 블록도 마찬가지로 00이고, 오른쪽 아래 블록은 A22A_2^2가 된다.

즉, 제곱을 해도 블록 대각 구조가 그대로 유지된다.

같은 방식으로 세제곱은

D3=[A1300A23]D^3 = \begin{bmatrix} A_1^3 & 0 \\ 0 & A_2^3 \end{bmatrix}

가 되고, 결국 일반적으로

Dn=diag(A1n,A2n,,Amn)D^n = \mathrm{diag}(A_1^n, A_2^n, \dots, A_m^n)

이 성립한다.

즉, 블록 대각 행렬의 거듭제곱은 각 대각 블록을 따로 거듭제곱한 뒤 다시 대각선 위에 놓는 것과 같다.

거듭제곱 예시

다음 행렬을 보자.

D=diag([1101],[2])D = \mathrm{diag} \left( \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}, \begin{bmatrix} 2 \end{bmatrix} \right)

그러면

Dn=diag([1101]n,[2]n)D^n = \mathrm{diag} \left( \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}^n, \begin{bmatrix} 2 \end{bmatrix}^n \right)

이다.

두 번째 블록은 바로

[2]n=[2n]\begin{bmatrix} 2 \end{bmatrix}^n = \begin{bmatrix} 2^n \end{bmatrix}

이 된다.

첫 번째 블록은 직접 몇 번 계산해 보면 패턴이 보인다.

[1101]2=[1201]\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}^2 = \begin{bmatrix} 1 & 2 \\ 0 & 1 \end{bmatrix} [1101]3=[1301]\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}^3 = \begin{bmatrix} 1 & 3 \\ 0 & 1 \end{bmatrix}

따라서 일반적으로

[1101]n=[1n01]\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}^n = \begin{bmatrix} 1 & n \\ 0 & 1 \end{bmatrix}

이 된다.

결국

Dn=diag([1n01],[2n])D^n = \mathrm{diag} \left( \begin{bmatrix} 1 & n \\ 0 & 1 \end{bmatrix}, \begin{bmatrix} 2^n \end{bmatrix} \right)

이다.

이 식은 큰 행렬 전체를 직접 nn번 곱하지 않아도, 각 블록을 따로 계산하면 된다는 뜻이다. 즉, 복잡한 반복 계산이 훨씬 단순해진다.