Ch.2 §2.3 — Elimination Using Matrices

소거 행렬 · 치환 행렬 · 확장 행렬 — 행 연산을 행렬 곱셈으로 추상화하기

소거법의 각 단계를 소거 행렬 E_ij로 표현하고, 행렬 곱셈의 결합·비가환 법칙을 이해하며, 확장 행렬 [A|b]로 좌우를 동시에 처리하는 방법을 다룬다. 직관적 설명 중심.

Math
Linear Algebra
저자

Kwangmin Kim

공개

2026년 04월 08일

1 왜 행 연산을 행렬로 표현하는가

§2.2에서 소거법을 절차적 언어로 기술했다 — “2행에서 1행의 3배를 뺀다”, “3행과 2행을 교환한다”. 이 절은 그 절차적 기술을 행렬 언어로 바꾼다.

노트

핵심 전환: 행 연산 → 행렬 곱셈

소거법의 각 단계는 소거 행렬 \(E_{ij}\) 를 왼쪽에서 곱하는 것과 동일하다.

\[\text{"$i$ 행에서 $j$ 행의 $\ell$ 배를 뺀다"} \iff E_{ij} \cdot (\text{현재 행렬})\]

  • 전체 소거 과정: \(A \xrightarrow{E_{21}} \xrightarrow{E_{31}} \xrightarrow{E_{32}} U\)
  • 행렬 언어: \((E_{32} E_{31} E_{21}) A = U\)

이 추상화가 중요한 이유:

  1. 기록: 소거 과정 전체를 행렬 곱 \(E_{32}E_{31}E_{21}\) 로 간결하게 기록한다.
  2. 역연산: 역행렬 \(E^{-1}\) 이 소거를 되돌린다 → \(A = LU\) 분해의 기초.
  3. 이론: 행 연산 = 행렬 곱이라는 사실로 선형대수의 구조를 분석할 수 있다.

2 \(Ax\) 복습: 행 방법과 열 방법

소거 행렬을 이해하기 전에 행렬-벡터 곱 \(Ax\) 의 두 방법을 다시 확인한다.

2.1 행 방법: 각 행과 \(x\) 의 내적

\(Ax\)\(i\) 번째 성분은 \(A\)\(i\) 번째 행과 \(x\) 의 내적이다.

\[(Ax)_i = \sum_{j=1}^{n} a_{ij} x_j = a_{i1}x_1 + a_{i2}x_2 + \cdots + a_{in}x_n\]

직관: 각 방정식(행)을 독립적으로 계산한다. \(i\) 번째 방정식에서 각 미지수에 계수를 곱하고 더한다.

2.2 열 방법: 열벡터들의 선형 결합

\(Ax\)\(A\) 의 열들을 \(x\) 의 성분으로 결합한 것이다.

\[Ax = x_1(\text{col}_1) + x_2(\text{col}_2) + \cdots + x_n(\text{col}_n)\]

직관: \(x\) 의 각 성분이 대응하는 열벡터에 곱하는 “가중치”이다.

3×3 예시로 두 방법이 같은 결과를 주는지 확인한다:

\[ A = \begin{bmatrix} 2 & 4 & -2 \\ 4 & 9 & -3 \\ -2 & -3 & 7 \end{bmatrix},\quad x = \begin{bmatrix} -1 \\ 2 \\ 2 \end{bmatrix} \]

행 방법: \((Ax)_1 = 2(-1) + 4(2) + (-2)(2) = -2 + 8 - 4 = 2\)

열 방법: \((-1)\begin{bmatrix}2\\4\\-2\end{bmatrix} + 2\begin{bmatrix}4\\9\\-3\end{bmatrix} + 2\begin{bmatrix}-2\\-3\\7\end{bmatrix} = \begin{bmatrix}-2+8-4\\-4+18-6\\2-6+14\end{bmatrix} = \begin{bmatrix}2\\8\\10\end{bmatrix}\)

두 방법 모두 \(Ax = b = (2, 8, 10)^\top\) 를 준다.


3 소거 행렬 \(E_{ij}\) — 한 단계 소거를 하나의 행렬로

3.1 \(E_{ij}\) 의 정의와 구성법

소거 행렬 \(E_{ij}\)는 “\(i\) 행에서 \(j\) 행의 \(\ell\) 배를 뺀다”는 한 가지 소거 연산을 행렬로 표현한 것이다.

구성 방법:

단위 행렬 \(I\) 에서 \((i, j)\) 위치의 0을 \(-\ell\) 로 바꾼다.

\[ E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ \boxed{-\ell_{21}} & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \quad \text{(2행 1열 위치에 } -\ell_{21} \text{)} \]

나머지 행들은 단위 행렬 \(I\) 의 행 그대로이다 — 해당 행에 아무것도 하지 않는다.

3.2 왜 단위 행렬 \(I\) 에서 출발하는가?

직관 1 — \(I\) 의 각 행은 “그대로 출력하라”는 지시이다

\(I\)\(v\) 에 곱하면 \(Iv = v\) 이다. 왜인가? \(I\)\(i\) 번째 행은 \(e_i^\top = [0, \ldots, 1, \ldots, 0]\) (i번째 위치만 1)이다.

\[ (Iv)_i = e_i^\top v = v_i \]

\(i\) 번째 행이 “\(v\)\(i\) 번째 성분을 그대로 가져오라”고 지시한다. 모든 행이 이런 식이므로 \(Iv = v\) 이다.

직관 2 — \(E_{ij}\) 의 각 행은 “행 연산 지시문”이다

\(E_{21}\) 의 세 행을 읽으면:

  • 1행 \([1, 0, 0]\): “1번째 성분을 그대로 출력하라” → 1행 변환 없음
  • 2행 \([-\ell, 1, 0]\): “\(-\ell \times\)(1번째 성분) \(+\) 1 \(\times\)(2번째 성분)을 출력하라” → 2행에서 1행의 \(\ell\) 배를 뺀다
  • 3행 \([0, 0, 1]\): “3번째 성분을 그대로 출력하라” → 3행 변환 없음

\(E_{ij}\)\(I\) 에서 딱 하나의 원소만 바꾼 행렬이다. 그 결과로 “딱 하나의 행만 바뀌고, 나머지는 그대로인” 변환이 만들어진다.

3.3\(-\ell\) 인가? — 부호의 직관

소거 연산은 “빼기”이다: \((\text{새 }i\text{행}) \leftarrow (\text{기존 }i\text{행}) - \ell \times (j\text{행})\).

\(E_{21}\) 을 벡터 \(v\) 에 곱하면 어떻게 되는지 직접 계산한다.

\[ E_{21} v = \begin{bmatrix} 1 & 0 & 0 \\ -\ell & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} = \begin{bmatrix} 1 \cdot v_1 + 0 + 0 \\ (-\ell) \cdot v_1 + 1 \cdot v_2 + 0 \\ 0 + 0 + 1 \cdot v_3 \end{bmatrix} = \begin{bmatrix} v_1 \\ v_2 - \ell v_1 \\ v_3 \end{bmatrix} \]

  • 1행: \(v_1\) 그대로.
  • 2행: \(v_2 - \ell v_1\) — 정확히 “\(v_1\)\(\ell\) 배를 뺀다”는 소거 연산이다.
  • 3행: \(v_3\) 그대로.

\(-\ell\) 을 넣는 이유: 행렬-벡터 곱에서 2행은 \((-\ell) \cdot v_1 + 1 \cdot v_2\) 이 되어야 하므로.

3.4 구체적 예시: \(E_{21}\) 으로 3×3 소거 1단계

이전 §2.2의 3×3 예시를 계속 사용한다.

\[ A = \begin{bmatrix} 2 & 4 & -2 \\ 4 & 9 & -3 \\ -2 & -3 & 7 \end{bmatrix},\quad b = \begin{bmatrix} 2 \\ 8 \\ 10 \end{bmatrix} \]

첫 번째 소거: 2행에서 1행의 \(\ell_{21} = 4/2 = 2\) 배를 뺀다.

\[ E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ -2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

\(E_{21} A\) 계산 — 각 행이 어떻게 바뀌는지 전개한다:

\[ E_{21} A = \begin{bmatrix} 1\cdot(2,4,-2) + 0 + 0 \\ (-2)\cdot(2,4,-2) + 1\cdot(4,9,-3) + 0 \\ 0 + 0 + 1\cdot(-2,-3,7) \end{bmatrix} = \begin{bmatrix} 2 & 4 & -2 \\ -4+4 & -8+9 & 4-3 \\ -2 & -3 & 7 \end{bmatrix} = \begin{bmatrix} 2 & 4 & -2 \\ 0 & 1 & 1 \\ -2 & -3 & 7 \end{bmatrix} \]

\(E_{21} b\) 계산:

\[ E_{21} b = \begin{bmatrix} 2 \\ -2(2)+8 \\ 10 \end{bmatrix} = \begin{bmatrix} 2 \\ 4 \\ 10 \end{bmatrix} \]

새 시스템 \(E_{21}A \cdot x = E_{21}b\)\(Ax = b\)같은 해를 갖는다. 소거가 행렬 곱으로 표현됐다.


4 행렬 곱셈의 의미와 법칙

4.1 행렬이 “작용한다(acts)”

\(E_{21}\)\(A\) 에 곱해질 때, \(E_{21}\)\(A\)변환한다. 행렬은 수동적인 수 배열이 아니라 능동적인 변환이다.

행렬 곱셈 \(AB\) 를 이해하는 세 가지 관점:

관점 해석
\((AB)_{ij} = (\text{row}_i \text{ of } A) \cdot (\text{col}_j \text{ of } B)\) 각 원소를 내적으로 계산
\(AB\) 의 각 열 \(= A \times (B\text{의 해당 열})\) \(B\) 의 각 열에 \(A\) 를 독립적으로 작용
\(AB\) 의 각 행 = \(A\) 의 해당 행 \(\times B\) \(A\) 의 각 행이 \(B\) 의 행들의 결합을 지시

4.2 결합 법칙 (Associative Law) — 성립한다

\[A(BC) = (AB)C\]

직관: 세 변환을 순서대로 적용할 때, 어떻게 묶어서 계산해도 최종 결과가 같다.

소거에서의 활용: \(E_{32}(E_{31}(E_{21}A)) = (E_{32}E_{31}E_{21})A\)

이 성질 덕분에 전체 소거 과정을 하나의 행렬 \(E = E_{32}E_{31}E_{21}\) 로 압축할 수 있다.

왜 결합 법칙이 성립하는가?

핵심 아이디어는 “행렬 곱셈이 함수 합성(function composition)이다”는 것이다. 함수 \(f\), \(g\), \(h\) 에 대해

\[(f \circ g \circ h)(x) = f(g(h(x)))\]

어떻게 괄호를 치든 \(h\) 먼저, \(g\) 다음, \(f\) 마지막 순으로 적용된다. 행렬 곱도 마찬가지다.

\[A(BC)v = A\bigl(B(Cv)\bigr), \quad (AB)Cv = A(B(Cv))\]

\(v\)\(C\) 먼저, 그다음 \(B\), 마지막으로 \(A\) 를 적용하는 순서는 괄호 위치와 관계없이 고정된다. 따라서 \(A(BC) = (AB)C\) 이다.

힌트

결합 법칙은 “어떤 순서로 곱해도 된다”는 뜻이 아니다. \(A, B, C\)순서는 고정된다. 결합 법칙은 그 순서를 유지한 채로 어디서 먼저 계산할지 (괄호 위치)만 자유롭다는 뜻이다. 교환 법칙(순서 바꾸기)과 혼동하지 않는다.

4.3 교환 법칙 (Commutative Law) — 일반적으로 성립하지 않는다

\[AB \neq BA \quad (\text{일반적})\]

왜 성립하지 않는가? 행렬은 방향이 있는 변환이다. “\(A\) 먼저, \(B\) 나중”과 “\(B\) 먼저, \(A\) 나중”은 다른 변환이다.

구체적 반례:

\[ E_{21} = \begin{bmatrix} 1 & 0 \\ -2 & 1 \end{bmatrix},\quad E_{12} = \begin{bmatrix} 1 & -3 \\ 0 & 1 \end{bmatrix} \]

\[ E_{21} E_{12} = \begin{bmatrix} 1 & -3 \\ -2 & 7 \end{bmatrix} \quad \neq \quad E_{12} E_{21} = \begin{bmatrix} 7 & -3 \\ -2 & 1 \end{bmatrix} \]

왜 결과가 다른가? — 단계별 직관

\(E_{21}\): “2행에서 1행의 2배를 뺀다”. \(E_{12}\): “1행에서 2행의 3배를 뺀다”.

\(v = (v_1, v_2)^\top\) 에 두 순서를 적용해 보자.

순서 A: \(E_{12}\) 를 먼저, 그다음 \(E_{21}\)

\[ v = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} \xrightarrow{E_{12}} \begin{bmatrix} v_1 - 3v_2 \\ v_2 \end{bmatrix} \xrightarrow{E_{21}} \begin{bmatrix} v_1 - 3v_2 \\ v_2 - 2(v_1 - 3v_2) \end{bmatrix} = \begin{bmatrix} v_1 - 3v_2 \\ -2v_1 + 7v_2 \end{bmatrix} \]

\(E_{21}\)\(E_{12}\)이미 수정된 1행에 작용한다. 따라서 2행에서 \(v_1 - 3v_2\) 의 2배를 빼게 된다.

순서 B: \(E_{21}\) 을 먼저, 그다음 \(E_{12}\)

\[ v = \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} \xrightarrow{E_{21}} \begin{bmatrix} v_1 \\ v_2 - 2v_1 \end{bmatrix} \xrightarrow{E_{12}} \begin{bmatrix} v_1 - 3(v_2 - 2v_1) \\ v_2 - 2v_1 \end{bmatrix} = \begin{bmatrix} 7v_1 - 3v_2 \\ -2v_1 + v_2 \end{bmatrix} \]

\(E_{12}\)\(E_{21}\)이미 수정된 2행에 작용한다. 1행에서 \(v_2 - 2v_1\) 의 3배를 빼게 된다.

핵심: 먼저 적용된 변환이 중간 값을 바꾸어 놓기 때문에 나중 변환의 실질적 계산이 달라진다. 순서를 바꾸면 “어떤 버전의 행”에 작용하는지가 달라진다.

노트

소거 행렬들이 서로 다른 행을 건드리는 경우 (예: \(E_{31}\)\(E_{32}\)) 순서를 바꾸어도 결과가 같다. 두 연산이 서로 다른 행을 변형하기 때문이다. 반면 \(E_{21}\)\(E_{12}\) 는 1행과 2행을 서로 참조하기 때문에 순서가 중요하다.

실용적 결론: 소거 행렬들의 순서가 중요하다. \(E_{21}\) 다음 \(E_{32}\) 와, \(E_{32}\) 다음 \(E_{21}\) 은 다른 결과를 낸다.

4.4 왼쪽 곱과 오른쪽 곱의 차이

\(E\)\(A\)왼쪽에서 곱하면 \(A\)에 작용한다.

\[EA: \quad \text{$E$ 의 각 행이 "$A$ 의 행들 중 어떤 것을 얼마만큼 합칠지" 지시}\]

\(E\)\(A\)오른쪽에서 곱하면 \(A\)에 작용한다.

\[AE: \quad \text{$E$ 의 각 열이 "$A$ 의 열들 중 어떤 것을 얼마만큼 합칠지" 지시}\]

소거법은 행 연산이므로 항상 왼쪽에서 곱한다.

예: \(E_{21}\) 을 오른쪽에서 곱하면 “1열의 4배를 2열에서 뺀다”는 연산이 된다.

4.5 열 단위 행렬 곱셈

\(A\)\(B = [b_1 \; b_2 \; b_3]\) 의 곱은 각 열에 독립적으로 \(A\) 를 작용한 것이다.

\[AB = A[b_1 \; b_2 \; b_3] = [Ab_1 \; Ab_2 \; Ab_3]\]

직관: \(B\) 의 각 열이 독립적인 \(Ax = b\) 문제의 우변이라고 볼 수 있다.

예시:

\[ E_{21} \begin{bmatrix} 2 & 4 & -2 \\ 4 & 9 & -3 \\ -2 & -3 & 7 \end{bmatrix} = \Bigl[ E_{21}\!\begin{pmatrix}2\\4\\-2\end{pmatrix} \;\Big|\; E_{21}\!\begin{pmatrix}4\\9\\-3\end{pmatrix} \;\Big|\; E_{21}\!\begin{pmatrix}-2\\-3\\7\end{pmatrix} \Bigr] = \begin{bmatrix} 2 & 4 & -2 \\ 0 & 1 & 1 \\ -2 & -3 & 7 \end{bmatrix} \]


5 전체 소거 과정: \(E_{32}E_{31}E_{21}A = U\)

§2.2의 3×3 예시 전체를 행렬 언어로 기술한다.

5.1 Step 1: \(E_{21}A\) — 2행에서 1행의 2배를 뺀다

\[ E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ -2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \implies E_{21} A = \begin{bmatrix} 2 & 4 & -2 \\ 0 & 1 & 1 \\ -2 & -3 & 7 \end{bmatrix} \]

5.2 Step 2: \(E_{31}(E_{21}A)\) — 3행에서 1행의 \((-1)\) 배를 뺀다 (= 1행을 더한다)

\(\ell_{31} = -2/2 = -1\) 이므로 \(E_{31}\)\((3,1)\) 위치에 \(-\ell_{31} = 1\) 이 들어간다.

\[ E_{31} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{bmatrix} \implies E_{31}(E_{21}A) = \begin{bmatrix} 2 & 4 & -2 \\ 0 & 1 & 1 \\ 0 & 1 & 5 \end{bmatrix} \]

확인: 새 3행 = 기존 3행 \((-2, -3, 7)\) + 1행 \((2, 4, -2)\) = \((0, 1, 5)\).

5.3 Step 3: \(E_{32}(E_{31}E_{21}A)\) — 3행에서 2행의 1배를 뺀다

\[ E_{32} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & -1 & 1 \end{bmatrix} \implies U = E_{32}(E_{31}E_{21}A) = \begin{bmatrix} 2 & 4 & -2 \\ 0 & 1 & 1 \\ 0 & 0 & 4 \end{bmatrix} \]

5.4 전체를 하나의 식으로

\[ (E_{32} E_{31} E_{21}) A = U \]


6 소거 행렬의 역행렬 — 빼기의 역은 더하기

\(E_{ij}\) 의 역행렬 \(E_{ij}^{-1}\) 은 소거를 되돌리는 행렬이다.

직관: \(E_{21}\) 이 “2행에서 1행의 \(\ell\) 배를 뺐으면”, \(E_{21}^{-1}\) 은 “2행에 1행의 \(\ell\) 배를 더한다”.

\[ E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ -\ell & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \implies E_{21}^{-1} = \begin{bmatrix} 1 & 0 & 0 \\ +\ell & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

부호만 반전하면 된다. 검증:

\[ E_{21}^{-1} E_{21} = \begin{bmatrix} 1 & 0 & 0 \\ \ell & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ -\ell & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ \ell - \ell & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} = I \checkmark \]

2행 1열: \(\ell \cdot 1 + 1 \cdot (-\ell) = 0\). 더하기와 빼기가 정확히 상쇄된다.

6.1 \(A = LU\) 연결

\[ E_{32}E_{31}E_{21}A = U \implies A = \underbrace{E_{21}^{-1}E_{31}^{-1}E_{32}^{-1}}_{= L}U = LU \]

\(L\) 의 원소들이 소거의 승수 \(\ell_{ij}\) 들과 같은 이유: 역행렬들을 순서대로 곱할 때, 서로 다른 열의 승수들이 간섭하지 않고 각자의 자리에 들어간다.

왜 승수들이 그대로 \(L\) 에 들어가는가?

세 역행렬을 명시적으로 곱해 보자.

\[ E_{21}^{-1} = \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix},\quad E_{31}^{-1} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -1 & 0 & 1 \end{bmatrix},\quad E_{32}^{-1} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 1 & 1 \end{bmatrix} \]

먼저 \(E_{21}^{-1} E_{31}^{-1}\):

\[ \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -1 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ -1 & 0 & 1 \end{bmatrix} \]

\(E_{21}^{-1}\)\((2,1)\) 위치의 2는 \(E_{31}^{-1}\) 의 1열과 내적할 때 \((1, 0, 0)\) 의 1열 → \(2 \cdot 1 + 1 \cdot 0 = 2\), 변하지 않는다. \(E_{31}^{-1}\)\((3,1)\) 위치의 \(-1\)\(E_{21}^{-1}\) 의 영향을 받지 않고 그대로 들어간다.

다음으로 \((E_{21}^{-1} E_{31}^{-1}) E_{32}^{-1}\):

\[ \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ -1 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ -1 & 1 & 1 \end{bmatrix} \]

\(E_{32}^{-1}\)\((3,2)\) 위치의 1이 \(L\)\((3,2)\) 위치에 그대로 들어간다.

비밀: 각 역행렬 \(E_{ij}^{-1}\) 은 오직 하나의 원소 \((\ell_{ij}\))만 \(I\) 에서 다르다. 이 원소가 이미 계산된 중간 행렬의 다른 열과 상호작용하지 않도록, 소거 순서(\(E_{21} \to E_{31} \to E_{32}\), 즉 왼쪽 열부터)가 설계되어 있다. 역순(\(E_{21}^{-1} \to E_{31}^{-1} \to E_{32}^{-1}\))으로 곱하면 각 승수가 “자신의 자리”에 간섭 없이 들어간다. 이것이 \(L\) 이 승수들의 행렬인 이유다.

\[ L = \begin{bmatrix} 1 & 0 & 0 \\ \ell_{21} & 1 & 0 \\ \ell_{31} & \ell_{32} & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & 0 \\ -1 & 1 & 1 \end{bmatrix} \]


7 치환 행렬 \(P_{ij}\) — 행 교환을 행렬로

7.1 치환 행렬의 구성과 의미

피벗 위치에 0이 나타나면 행 교환이 필요하다. 행 교환도 행렬로 표현한다.

치환 행렬 \(P_{ij}\): 단위 행렬 \(I\) 에서 \(i\) 행과 \(j\) 행을 서로 바꾼 행렬.

\[ P_{23} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix} \]

\(P_{23}\)\(I\) 에서 2행과 3행을 교환한 것임을 확인한다: 2행이 \([0,0,1]\) (원래 \(I\) 의 3행), 3행이 \([0,1,0]\) (원래 \(I\) 의 2행).

\(P_{23}\) 을 벡터에 곱하면:

\[ P_{23} \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} = \begin{bmatrix} v_1 \\ v_3 \\ v_2 \end{bmatrix} \quad \text{(2번째와 3번째 성분이 교환된다)} \]

직관: \(P_{23}\) 의 2행 \([0,0,1]\) 은 “\(v\) 의 3번째 성분을 출력하라”는 지시이다. 3행 \([0,1,0]\) 은 “2번째 성분을 출력하라”는 지시이다. 이처럼 치환 행렬의 각 행은 원본의 어떤 성분을 가져올지 지정한다.

\(P_{23}\) 을 행렬에 곱하면:

\[ P_{23} \begin{bmatrix} 2 & 4 & 1 \\ 0 & 0 & 3 \\ 0 & 6 & 5 \end{bmatrix} = \begin{bmatrix} 2 & 4 & 1 \\ 0 & 6 & 5 \\ 0 & 0 & 3 \end{bmatrix} \]

2행(피벗 0)과 3행(피벗 6)이 교환되어 소거를 계속할 수 있다.

7.2 치환 행렬의 핵심 성질

\[P_{ij}^{-1} = P_{ij}^\top = P_{ij}\]

\(P_{ij}^2 = I\) 인가? — “두 번 교환 = 원상복구”

\(P_{23}\) 을 두 번 적용하면:

\[ \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} \xrightarrow{P_{23}} \begin{bmatrix} v_1 \\ v_3 \\ v_2 \end{bmatrix} \xrightarrow{P_{23}} \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} \]

2행과 3행을 교환하고, 다시 교환하면 원래로 돌아온다. 따라서 \(P_{23} P_{23} = I\), 즉 \(P_{23}^{-1} = P_{23}\) 이다.

\(P_{ij}^\top = P_{ij}^{-1}\) 인가? — 직교 행렬의 특성

\(P_{23}\) 의 전치를 계산한다:

\[ P_{23} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix} \implies P_{23}^\top = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix} = P_{23} \]

\(P_{23}\) 이 대칭 행렬(\(P_{23}^\top = P_{23}\))이므로 \(P_{23}^\top = P_{23} = P_{23}^{-1}\).

일반적으로 치환 행렬의 행들은 단위 벡터 \(e_i\) 들의 순열이다. 이 행들은 서로 직교하고 각 노름이 1이다 — 즉 치환 행렬은 직교 행렬(orthogonal matrix)이다. 직교 행렬은 \(Q^\top Q = I\) 를 만족하므로 \(Q^{-1} = Q^\top\).

행 교환을 두 번 하면 원래로 돌아온다: \(P_{ij} P_{ij} = I\).


8 확장 행렬 (Augmented Matrix) — 좌우를 동시에 처리

8.1 확장 행렬의 아이디어

소거는 \(A\) 의 행과 \(b\) 의 성분에 동시에 같은 연산을 적용한다. 이 두 가지를 하나로 합쳐 확장 행렬 \([A \mid b]\) 를 만들면 효율적이다.

\[ [A \mid b] = \left[\begin{array}{ccc|c} 2 & 4 & -2 & 2 \\ 4 & 9 & -3 & 8 \\ -2 & -3 & 7 & 10 \end{array}\right] \]

소거 행렬 \(E\)\([A \mid b]\) 에 작용하면 좌우 양쪽이 동시에 변환된다:

\[ E_{21} [A \mid b] = [E_{21}A \mid E_{21}b] \]

왜 확장 행렬이 해를 보존하는가? — 등가 변환의 원리

\(Ax = b\) 의 해 \(x^*\) 가 존재한다고 하자. \(E_{21}A\) 를 계수 행렬로 갖는 새 시스템 \(E_{21}Ax = E_{21}b\)\(x^*\) 를 대입하면:

\[ E_{21}A x^* = E_{21}(Ax^*) = E_{21}b \checkmark \]

\(x^*\) 는 새 시스템도 만족한다. 역방향: \(E_{21}\) 은 가역이므로, \(E_{21}Ax = E_{21}b\) 를 만족하는 \(x\) 는 양변에 \(E_{21}^{-1}\) 을 곱해 \(Ax = b\) 로 복원된다. 따라서 두 시스템의 해집합이 일치한다.

\[ Ax = b \iff E_{21}Ax = E_{21}b \]

이것이 소거가 해를 바꾸지 않는 이유이다. 소거 행렬 \(E_{ij}\) 는 항상 가역이므로(역행렬 = 부호 반전) 이 등가성이 보장된다.

직관: \([A \mid b]\)\(n \times (n+1)\) 행렬로 보고 \(E\) 를 왼쪽에서 곱한다. \(A\) 부분의 소거와 \(b\) 부분의 변환이 동시에 일어난다.

8.2 3×3 예시: 확장 행렬로 전체 소거 추적

초기:

\[ \left[\begin{array}{ccc|c} 2 & 4 & -2 & 2 \\ 4 & 9 & -3 & 8 \\ -2 & -3 & 7 & 10 \end{array}\right] \]

\(E_{21}\) 적용 (\(R_2 - 2R_1\)):

\[ \left[\begin{array}{ccc|c} 2 & 4 & -2 & 2 \\ 0 & 1 & 1 & 4 \\ -2 & -3 & 7 & 10 \end{array}\right] \]

\(E_{31}\) 적용 (\(R_3 + R_1\)):

\[ \left[\begin{array}{ccc|c} 2 & 4 & -2 & 2 \\ 0 & 1 & 1 & 4 \\ 0 & 1 & 5 & 12 \end{array}\right] \]

\(E_{32}\) 적용 (\(R_3 - R_2\)):

\[ \left[\begin{array}{ccc|c} 2 & 4 & -2 & 2 \\ 0 & 1 & 1 & 4 \\ 0 & 0 & 4 & 8 \end{array}\right] = [U \mid c] \]

\(Ux = c\): 후방 대입으로 \(z = 2\), \(y = 2\), \(x = -1\).

8.3 여러 우변을 동시에 처리

\[ [A \mid b_1 \mid b_2] \xrightarrow{\text{소거}} [U \mid c_1 \mid c_2] \]

\(LU\) 분해를 한 번 계산하고 여러 \(b\) 에 재사용하는 것과 동일하다.


9 Worked Examples

9.1 예시 1: \(E_{21}\) 의 오른쪽 곱 — 열 연산이 된다

\(E_{21}\) (\(\ell = 4\))을 오른쪽에서 곱하면:

\[ A E_{21} = A \begin{bmatrix} 1 & 0 & 0 \\ -4 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \]

\(AE_{21}\) 의 각 열은 \(A\) 의 열들의 선형 결합이다: 새 1열 \(= A\) 의 1열 \(- 4 \times\) 2열, 새 2열 = 2열, 새 3열 = 3열.

이것은 행 연산이 아니라 열 연산이다. 소거에서는 쓰지 않지만, 열 연산이 필요할 때 오른쪽 곱을 사용한다.

9.2 예시 2: \(P_{32}E_{21}\) — 두 연산을 하나의 행렬로

다음 시스템을 소거한다.

\[ \begin{cases} x + 2y + 2z = 1 \\ 4x + 8y + 9z = 3 \\ 3y + 2z = 1 \end{cases} \implies [A \mid b] = \left[\begin{array}{ccc|c} 1 & 2 & 2 & 1 \\ 4 & 8 & 9 & 3 \\ 0 & 3 & 2 & 1 \end{array}\right] \]

Step 1 — \(E_{21}\) 적용 (\(\ell_{21} = 4\)):

\[ E_{21}[A \mid b] = \left[\begin{array}{ccc|c} 1 & 2 & 2 & 1 \\ 0 & 0 & 1 & -1 \\ 0 & 3 & 2 & 1 \end{array}\right] \]

2열 피벗 위치가 0. 행 교환 필요.

Step 2 — \(P_{32}\) 적용 (\(R_2 \leftrightarrow R_3\)):

\[ P_{32}E_{21}[A \mid b] = \left[\begin{array}{ccc|c} 1 & 2 & 2 & 1 \\ 0 & 3 & 2 & 1 \\ 0 & 0 & 1 & -1 \end{array}\right] = [U \mid c] \]

이미 상삼각. 후방 대입: \(z = -1\), \(y = 1\), \(x = 1\).

합성 행렬 \(M = P_{32}E_{21}\):

\[ M = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ -4 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 1 \\ -4 & 1 & 0 \end{bmatrix} \]

9.3 예시 3: 행렬 곱셈의 두 가지 방법

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

방법 1 — 내적 (행×열):

\((AB)_{11} = [3,4] \cdot [2,1]^\top = 10\), \((AB)_{12} = [3,4] \cdot [4,1]^\top = 16\), … 총 6번 내적.

방법 2 — 열×행 (외적 합, Outer Product Sum):

\[ AB = \underbrace{\begin{bmatrix} 3 \\ 1 \\ 2 \end{bmatrix}}_{A\text{의 열 1}} \underbrace{[2 \;\; 4]}_{B\text{의 행 1}} + \underbrace{\begin{bmatrix} 4 \\ 5 \\ 0 \end{bmatrix}}_{A\text{의 열 2}} \underbrace{[1 \;\; 1]}_{B\text{의 행 2}} = \begin{bmatrix} 6 & 12 \\ 2 & 4 \\ 4 & 8 \end{bmatrix} + \begin{bmatrix} 4 & 4 \\ 5 & 5 \\ 0 & 0 \end{bmatrix} = \begin{bmatrix} 10 & 16 \\ 7 & 9 \\ 4 & 8 \end{bmatrix} \]

열×행 방법의 의미: 각 항이 랭크 1 행렬(Rank-1 Matrix)이다. \(AB\) 는 이런 랭크 1 행렬들의 합이다. 이 관점은 SVD에서 핵심이 된다.


10 ML/DL에서의 연결

10.1 배치 처리와 확장 행렬

딥러닝의 배치(Batch) 처리는 여러 샘플을 한 번에 처리한다:

\[ Y = AX, \quad X = [x_1 \mid x_2 \mid \cdots \mid x_B] \]

\(A\) 를 한 번만 계산하고 \(B\) 개의 \(x\) 에 동시에 적용하는 것은, 확장 행렬에 \(A\) 를 곱하는 것과 같은 논리이다.

10.2 역전파에서의 비가환성

신경망에서 레이어를 거꾸로 통과하는 역전파(Backpropagation)는 자코비안 행렬들의 곱이다.

\[\frac{\partial \mathcal{L}}{\partial x} = W_1^\top W_2^\top \cdots \frac{\partial \mathcal{L}}{\partial y}\]

행렬 곱의 비가환성 때문에 순서를 바꾸면 안 된다. \(AB \neq BA\) 라는 사실이 역전파 구현에서 핵심이다.


11 코드로 확인하기

11.1 Step 1 — 소거 행렬 \(E_{ij}\) 직접 구성

import numpy as np

def make_E(n, i, j, ell):
    """
    n×n 소거 행렬 E_ij 생성.
    i행에서 j행의 ell배를 뺀다.
    (i,j) 위치에 -ell, 나머지는 단위 행렬.
    (0-indexed)
    """
    E = np.eye(n)
    E[i, j] = -ell
    return E

def make_P(n, i, j):
    """n×n 치환 행렬 P_ij 생성 (i, j 행 교환). 0-indexed."""
    P = np.eye(n)
    P[[i, j]] = P[[j, i]]   # 행 교환
    return P

A = np.array([[2, 4, -2], [4, 9, -3], [-2, -3, 7]], dtype=float)
b = np.array([2, 8, 10], dtype=float)

# Step 1: E21 (2행에서 1행의 2배 뺌, 0-indexed: i=1, j=0, ell=2)
E21 = make_E(3, 1, 0, 2)
print("E21:\n", E21)

# Step 2: E31 (3행에서 1행의 -1배 뺌, 0-indexed: i=2, j=0, ell=-1)
E31 = make_E(3, 2, 0, -1)
print("E31:\n", E31)

# Step 3: E32 (3행에서 2행의 1배 뺌, 0-indexed: i=2, j=1, ell=1)
E32 = make_E(3, 2, 1, 1)
print("E32:\n", E32)

# 전체 소거
U = E32 @ E31 @ E21 @ A
c = E32 @ E31 @ E21 @ b
print("U:\n", U)
print("c:", c)   # [2. 4. 8.]

# L 계산 (역행렬들의 곱)
L = np.linalg.inv(E21) @ np.linalg.inv(E31) @ np.linalg.inv(E32)
print("L:\n", L)
# [[1.  0.  0.]
#  [2.  1.  0.]
#  [-1. 1.  1.]]  ← 승수들이 그대로!

print("LU = A?", np.allclose(L @ U, A))  # True

11.2 Step 2 — 확장 행렬로 소거 (실용 구현)

import numpy as np

def gaussian_elimination_augmented(A, b):
    """
    확장 행렬 [A|b]로 소거 수행.
    소거 행렬 E들과 L을 함께 추적한다.
    """
    n = len(b)
    Ab = np.hstack([A.copy().astype(float), b.reshape(-1, 1).astype(float)])
    L = np.eye(n)

    print("초기 [A|b]:\n", Ab)

    for j in range(n - 1):          # 피벗 열
        pivot = Ab[j, j]
        if abs(pivot) < 1e-12:
            raise ValueError(f"피벗 = 0: {j}열, 행 교환 필요")

        for i in range(j + 1, n):   # 피벗 아래 행들
            ell = Ab[i, j] / pivot
            Ab[i, :] -= ell * Ab[j, :]
            L[i, j] = ell            # L에 승수 기록

        print(f"Step {j+1} 후 [A|b]:\n", Ab)

    U = Ab[:, :-1]
    c = Ab[:, -1]

    # 후방 대입
    x = np.zeros(n)
    for i in range(n - 1, -1, -1):
        x[i] = (c[i] - U[i, i+1:] @ x[i+1:]) / U[i, i]

    return x, L, U

A = np.array([[2, 4, -2], [4, 9, -3], [-2, -3, 7]], dtype=float)
b = np.array([2, 8, 10], dtype=float)

x, L, U = gaussian_elimination_augmented(A, b)
print("\n해:", x)              # [-1.  2.  2.]
print("L:\n", L)               # 승수들이 대각선 아래에
print("U:\n", U)               # 피벗들이 대각선에
print("LU = A?", np.allclose(L @ U, A))   # True

11.3 Step 3 — 교환 법칙 검증

import numpy as np

# AB ≠ BA 확인
A = np.array([[1, 2], [0, 1]], dtype=float)
B = np.array([[1, 0], [3, 1]], dtype=float)

print("AB:\n", A @ B)
print("BA:\n", B @ A)
print("AB == BA?", np.allclose(A @ B, B @ A))   # False

# E_ij들의 순서 차이
E21 = np.array([[1., 0., 0.], [-2., 1., 0.], [0., 0., 1.]])
E32 = np.array([[1., 0., 0.], [0., 1., 0.], [0., -1., 1.]])

print("\nE32 @ E21:\n", E32 @ E21)
print("E21 @ E32:\n", E21 @ E32)
print("같은가?", np.allclose(E32 @ E21, E21 @ E32))   # False

12 핵심 요약

개념 수식 / 의미
소거 행렬 \(E_{ij}\) \(I\) 에서 \((i,j)\) 위치에 \(-\ell\)\(i\) 행에서 \(j\) 행의 \(\ell\) 배를 뺀다
\(E_{ij}v\) 효과 \(v_i \to v_i - \ell v_j\), 나머지 불변
\(E_{ij}A\) 효과 \(A\)\(i\)\(\to\) \(i\)\(- \ell \times j\) 행 (왼쪽 곱 = 행 연산)
왼쪽 곱 vs 오른쪽 곱 왼쪽 = 행 연산, 오른쪽 = 열 연산
역행렬 \(E_{ij}^{-1}\) \((i,j)\) 위치를 \(+\ell\) 로 — 빼기의 역은 더하기
치환 행렬 \(P_{ij}\) \(I\) 에서 \(i\) 행과 \(j\) 행 교환, \(P_{ij}^2 = I\)
결합 법칙 \(A(BC) = (AB)C\) — 성립
교환 법칙 \(AB \neq BA\) — 일반적으로 불성립
확장 행렬 \([A \mid b]\) 로 좌우를 동시에 소거
전체 소거 \(E_{32}E_{31}E_{21}A = U\), \(A = LU\)

13 관련 주제

선행 지식

이 챕터 다음

관련 심화

Subscribe

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