1 이 절이 다루는 것
§2.3에서 행 연산을 소거 행렬 \(E_{ij}\) 로 표현했다. 이 절에서는 한 걸음 더 나아가 행렬 자체를 대상으로 한 연산 규칙을 체계화한다.
§2.4의 핵심 질문
- 행렬을 언제 더하고 곱할 수 있는가? (모양 조건)
- 행렬 곱셈을 보는 네 가지 방법은 무엇인가?
- 어떤 법칙은 성립하고 어떤 법칙은 깨지는가?
- 행렬을 블록으로 쪼개면 어떤 이점이 있는가?
2 행렬 덧셈과 스칼라 곱
2.1 기본 규칙
행렬 덧셈은 같은 모양의 행렬에서만 가능하다. 같은 위치의 원소끼리 더한다.
\[ \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 0 & 0 \end{bmatrix} + \begin{bmatrix} 2 & 2 \\ 4 & 4 \\ 9 & 9 \end{bmatrix} = \begin{bmatrix} 3 & 4 \\ 7 & 8 \\ 9 & 9 \end{bmatrix} \]
스칼라 \(c\) 를 행렬에 곱하면 모든 원소에 \(c\) 를 곱한다.
\[ 2 \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 0 & 0 \end{bmatrix} = \begin{bmatrix} 2 & 4 \\ 6 & 8 \\ 0 & 0 \end{bmatrix} \]
직관: 행렬을 “벡터들의 배열”로 보면 덧셈과 스칼라 곱은 벡터 연산의 자연스러운 확장이다. 열벡터는 열이 하나인 행렬(\(n = 1\))의 특수한 경우다.
2.2 영 행렬과 음수 행렬
- 영 행렬(Zero Matrix) \(\mathbf{0}\): 모든 원소가 0. \(A + \mathbf{0} = A\).
- 음수 행렬 \(-A\): \(c = -1\) 을 곱한 것. 모든 부호를 반전. \(A + (-A) = \mathbf{0}\).
2.3 원소 표기
행렬 \(A\) 의 \(i\) 행 \(j\) 열 원소를 \(a_{ij}\) 또는 \(A(i,j)\) 로 쓴다. \(i\) 는 \(1\) 부터 \(m\) 까지, \(j\) 는 \(1\) 부터 \(n\) 까지이다.
3 행렬 곱셈 — 언제 가능한가
3.1 모양 조건
\[ \underbrace{A}_{m \times n} \underbrace{B}_{n \times p} = \underbrace{AB}_{m \times p} \]
\(A\) 의 열 수 = \(B\) 의 행 수 이어야 한다. 이 조건이 맞으면 \(AB\) 는 \(m \times p\) 행렬이 된다.
직관: \(A\) 의 각 행은 길이 \(n\) 의 벡터이고, \(B\) 의 각 열도 길이 \(n\) 의 벡터이어야 내적(dot product)이 정의된다. 길이가 맞아야 곱할 수 있다.
| \(A\) 모양 | \(B\) 모양 | \(AB\) 가능? | \(AB\) 모양 |
|---|---|---|---|
| \(3 \times 2\) | \(2 \times 4\) | 가능 | \(3 \times 4\) |
| \(3 \times 2\) | \(3 \times 2\) | 불가 | — |
| \(1 \times n\) | \(n \times 1\) | 가능 | \(1 \times 1\) (스칼라) |
| \(n \times 1\) | \(1 \times n\) | 가능 | \(n \times n\) |
4 행렬 곱셈의 네 가지 방법
같은 \(AB\) 를 네 가지 관점으로 볼 수 있다. 모두 동일한 결과를 주지만, 어떤 관점을 쓰느냐에 따라 이해의 깊이가 달라진다.
4.1 방법 1: 내적 방법 (표준 방법)
\((AB)_{ij}\) = \(A\) 의 \(i\) 번째 행과 \(B\) 의 \(j\) 번째 열의 내적.
\[ (AB)_{ij} = \sum_{k=1}^{n} a_{ik} b_{kj} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{in}b_{nj} \]
직관: \(n \times n\) 행렬 두 개를 곱하면 \(n^2\) 개의 내적이 필요하고, 각 내적에 \(n\) 번의 곱이 필요하므로 총 \(n^3\) 번의 곱셈이 필요하다. \(n = 100\) 이면 100만 번.
예시 (\(2 \times 2\)):
\[ \begin{bmatrix} 1 & 1 \\ 2 & -1 \end{bmatrix} \begin{bmatrix} 2 & 2 \\ 3 & 4 \end{bmatrix} = \begin{bmatrix} 1\cdot2+1\cdot3 & 1\cdot2+1\cdot4 \\ 2\cdot2+(-1)\cdot3 & 2\cdot2+(-1)\cdot4 \end{bmatrix} = \begin{bmatrix} 5 & 6 \\ 1 & 0 \end{bmatrix} \]
4.2 방법 2: 열 방법 — \(A\) 가 \(B\) 의 각 열에 작용
\(B = [b_1 \; b_2 \; \cdots \; b_p]\) 로 열 분해하면:
\[ AB = A[b_1 \; b_2 \; \cdots \; b_p] = [Ab_1 \; Ab_2 \; \cdots \; Ab_p] \]
\(AB\) 의 \(j\) 번째 열 = \(A \times (B\) 의 \(j\) 번째 열 \()\).
직관: \(B\) 의 각 열을 독립적인 \(Ax = b_j\) 문제의 우변으로 볼 수 있다. \(A\) 가 \(b_j\) 각각에 따로 작용하고, 그 결과들을 나란히 붙인 것이 \(AB\) 이다.
4.3 방법 3: 행 방법 — \(A\) 의 각 행이 \(B\) 전체에 작용
\(A\) 의 \(i\) 번째 행 \(= \text{row}_i(A)\) 로 표기하면:
\[ \text{row}_i(AB) = \text{row}_i(A) \cdot B \]
\(AB\) 의 \(i\) 번째 행 = \(A\) 의 \(i\) 번째 행 \(\times B\) = \(B\) 의 행들의 선형 결합.
직관: §2.3의 소거 행렬에서 본 것과 같다. \(E_{21}A\) 에서 \(E_{21}\) 의 각 행이 \(A\) 의 행들 중 어떤 것을 얼마만큼 합칠지 지시했다. 그것이 방법 3의 일반화이다.
4.4 방법 4: 열×행 방법 (외적 합 / Outer Product Sum)
\(A\) 의 \(k\) 번째 열 \(a_k\) (\(m \times 1\))와 \(B\) 의 \(k\) 번째 행 \(b_k^\top\) (\(1 \times p\))를 곱하면 랭크 1 행렬(\(m \times p\))이 만들어진다. \(AB\) 는 이들의 합이다.
\[ AB = \sum_{k=1}^{n} \underbrace{a_k}_{m \times 1} \underbrace{b_k^\top}_{1 \times p} = a_1 b_1^\top + a_2 b_2^\top + \cdots + a_n b_n^\top \]
구체적 예시:
\[ \begin{bmatrix} 1 & 4 \\ 1 & 5 \end{bmatrix} \begin{bmatrix} 3 & 2 \\ 1 & 0 \end{bmatrix} = \underbrace{\begin{bmatrix} 1 \\ 1 \end{bmatrix}\begin{bmatrix} 3 & 2 \end{bmatrix}}_{\text{열 1} \times \text{행 1}} + \underbrace{\begin{bmatrix} 4 \\ 5 \end{bmatrix}\begin{bmatrix} 1 & 0 \end{bmatrix}}_{\text{열 2} \times \text{행 2}} = \begin{bmatrix} 3 & 2 \\ 3 & 2 \end{bmatrix} + \begin{bmatrix} 4 & 0 \\ 5 & 0 \end{bmatrix} = \begin{bmatrix} 7 & 2 \\ 8 & 2 \end{bmatrix} \]
직관: \(AB\) 를 랭크 1 행렬들의 합으로 분해한다. 각 항은 \(A\) 의 열 하나와 \(B\) 의 행 하나가 만드는 “단순한 구조”이다. 이 관점은 SVD에서 핵심이 된다.
네 가지 방법 비교
| 방법 | 계산 단위 | 결과 원소 |
|---|---|---|
| 내적 (행×열) | \((AB)_{ij}\) = 스칼라 1개 | 내적 1번 |
| 열 방법 | \(AB\) 의 열 1개 | \(Ax\) 1번 |
| 행 방법 | \(AB\) 의 행 1개 | 행 결합 1번 |
| 열×행 방법 | 랭크 1 행렬 1개 | 전체의 부분합 |
곱셈 횟수(\(n^3\) 또는 \(mnp\))는 모두 동일하다. 관점만 다르다.
5 행렬 연산의 법칙들
5.1 성립하는 법칙들
덧셈 법칙 (3개):
\[ A + B = B + A \quad (\text{교환 법칙}) \]
\[ c(A + B) = cA + cB \quad (\text{분배 법칙}) \]
\[ A + (B + C) = (A + B) + C \quad (\text{결합 법칙}) \]
곱셈 법칙 (3개):
\[ C(A + B) = CA + CB \quad (\text{왼쪽 분배 법칙}) \]
\[ (A + B)C = AC + BC \quad (\text{오른쪽 분배 법칙}) \]
\[ A(BC) = (AB)C \quad (\text{결합 법칙}) \]
왜 \(A(B+C) = AB + AC\) 인가? 한 열씩 확인하면 된다. \(j\) 번째 열만 보면 \(A(b_j + c_j) = Ab_j + Ac_j\) — 이것이 선형성이다.
왜 \(A(BC) = (AB)C\) 인가? 행렬 곱이 함수 합성이기 때문이다. \(v\) 에 \(C\), \(B\), \(A\) 순으로 적용하는 순서는 괄호 위치와 무관하게 고정된다.
5.2 깨지는 법칙: 교환 법칙
\[ AB \neq BA \quad (\text{일반적}) \]
구체적 반례:
\[ BA = \begin{bmatrix} 0 & 1 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 0 & 0 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \quad \neq \quad AB = \begin{bmatrix} 0 & 0 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 0 & 0 \end{bmatrix} = \begin{bmatrix} 0 & 0 \\ 0 & 1 \end{bmatrix} \]
왜 성립하지 않는가?
\(AB\): \(B\) 가 먼저 변환하고, \(A\) 가 그 결과에 작용한다. \(BA\): \(A\) 가 먼저, \(B\) 가 나중이다. 각 변환이 상태를 바꿔놓기 때문에 순서가 달라지면 결과도 달라진다.
교환 법칙이 성립하는 예외적 경우
- 단위 행렬: \(AI = IA\) — \(I\) 는 모든 행렬과 교환된다.
- 스칼라 행렬: \(A(cI) = (cI)A\) — \(cI\) 형태의 행렬만 모든 행렬과 교환된다.
- 모양이 다른 경우: \(A\) 가 \(m \times n\), \(B\) 가 \(n \times m\) (\(m \neq n\))이면 \(AB\) 는 \(m \times m\), \(BA\) 는 \(n \times n\) 으로 크기 자체가 달라 비교 불가.
5.3 행렬의 거듭제곱
\(A\) 가 정사각 행렬(\(n \times n\))이면 거듭제곱이 정의된다.
\[ A^p = \underbrace{A \cdot A \cdots A}_{p\text{ 개}} \]
결합 법칙 덕분에 지수 법칙이 성립한다.
\[ A^p A^q = A^{p+q}, \quad (A^p)^q = A^{pq} \]
\(A^0 = I\) (영 거듭제곱 = 단위 행렬). \(A^{-1}\) 이 존재하면 \(A^{-p} = (A^{-1})^p\).
5.4 대각합 (Trace)
정사각 행렬 \(A \in \mathbb{R}^{n \times n}\) 의 대각합(trace)은 주대각선 원소들의 합이다.
\[\operatorname{tr}(A) = \sum_{i=1}^{n} a_{ii}\]
핵심 성질:
- 선형성: \(\operatorname{tr}(A + B) = \operatorname{tr}(A) + \operatorname{tr}(B)\), \(\operatorname{tr}(cA) = c \operatorname{tr}(A)\)
- 전치 불변: \(\operatorname{tr}(A^\top) = \operatorname{tr}(A)\)
- 순환 성질: \(\operatorname{tr}(AB) = \operatorname{tr}(BA)\) (크기 조건만 맞으면 성립)
- 이로부터 \(\operatorname{tr}(ABC) = \operatorname{tr}(BCA) = \operatorname{tr}(CAB)\) (순환 이동 가능, 임의 순서 교환은 아님)
왜 중요한가: Ch.6에서 \(\operatorname{tr}(A) =\) 고윳값의 합이라는 사실이 증명된다. 따라서 대각합은 기저 변환 아래 불변이다 — 이것이 \(\operatorname{tr}(P^{-1}AP) = \operatorname{tr}(A)\) 의 의미이다. 행렬식이 “고윳값의 곱”인 것과 대칭이다.
예시: \(\operatorname{tr}\!\begin{bmatrix} 2 & 3 & 1 \\ 0 & 5 & 2 \\ 1 & 1 & 4 \end{bmatrix} = 2 + 5 + 4 = 11\)
6 블록 행렬과 블록 곱셈
6.1 블록 분할의 아이디어
큰 행렬을 블록(block)이라 부르는 작은 행렬들로 분할할 수 있다. 블록이 맞게 맞으면 블록 단위로 더하고 곱할 수 있다.
\[ A = \begin{bmatrix} A_{11} & A_{12} \\ A_{21} & A_{22} \end{bmatrix},\quad B = \begin{bmatrix} B_{11} & B_{12} \\ B_{21} & B_{22} \end{bmatrix} \]
블록 곱셈 조건: \(A\) 의 열 분할과 \(B\) 의 행 분할이 일치해야 한다.
\[ AB = \begin{bmatrix} A_{11}B_{11} + A_{12}B_{21} & \cdots \\ A_{21}B_{11} + A_{22}B_{21} & \cdots \end{bmatrix} \]
블록들을 마치 숫자처럼 취급해 곱하면 된다. 단, 블록끼리는 \(A\) 앞, \(B\) 뒤의 순서를 지킨다.
왜 블록 분할이 유용한가?
- 구조가 보인다 — 반복되는 패턴을 명시적으로 표현한다.
- 확장 행렬 \([A \mid b]\) 도 블록: \(E[A \mid b] = [EA \mid Eb]\) 는 블록 곱셈이다.
- 병렬 계산: 블록을 독립적으로 처리할 수 있다.
6.2 열×행 분해 = 블록 곱셈의 특수 경우
\(A\) 의 블록 = \(n\) 개의 열, \(B\) 의 블록 = \(n\) 개의 행으로 분할하면:
\[ AB = [a_1 \; \cdots \; a_n] \begin{bmatrix} b_1^\top \\ \vdots \\ b_n^\top \end{bmatrix} = a_1 b_1^\top + \cdots + a_n b_n^\top \]
이것이 §2.4의 방법 4(열×행)이다. 블록 곱셈의 관점에서 자연스럽게 유도된다.
6.3 블록 소거와 슈어 여인수
2×2 블록 행렬 \(A\) 를 소거하면:
\[ \begin{bmatrix} I & 0 \\ -CA^{-1} & I \end{bmatrix} \begin{bmatrix} A & B \\ C & D \end{bmatrix} = \begin{bmatrix} A & B \\ 0 & \underbrace{D - CA^{-1}B}_{S} \end{bmatrix} \]
\(S = D - CA^{-1}B\) 를 슈어 여인수(Schur complement)라 한다. 스칼라 소거에서 \(d - cb/a\) 의 블록 버전이다.
직관: 피벗 블록 \(A\) 에 대한 소거를 수행하면, 나머지 블록(\(D\))에서 “\(A\) 를 통한 간섭”을 제거한 나머지(\(S\))가 남는다. 이 \(S\) 가 다음 단계 소거의 피벗 블록이 된다.
7 직관 정리: 왜 각 관점이 필요한가
| 관점 | 핵심 질문 | 언제 유용한가 |
|---|---|---|
| 내적 (행×열) | \((AB)_{ij} = ?\) | 특정 원소 계산, 기본 정의 |
| 열 방법 | \(AB\) 의 \(j\) 열 = ? | \(Ax = b\) 시스템 이해, 열 공간 분석 |
| 행 방법 | \(AB\) 의 \(i\) 행 = ? | 소거 행렬, 행 공간 분석 |
| 열×행 방법 | \(AB\) = 랭크 1 행렬들의 합? | SVD, 저차원 근사, 외적 구조 이해 |
| 블록 방법 | 큰 행렬의 구조는? | 병렬 계산, 구조화된 행렬 분석 |
8 Worked Examples
8.1 예시 1: 내적 방법 vs 열×행 방법
\[ AB = \begin{bmatrix} 3 & 4 \\ 1 & 5 \\ 2 & 0 \end{bmatrix} \begin{bmatrix} 2 & 4 \\ 1 & 1 \end{bmatrix} \]
내적 방법 (6번의 내적):
\[ AB = \begin{bmatrix} 3 \cdot 2 + 4 \cdot 1 & 3 \cdot 4 + 4 \cdot 1 \\ 1 \cdot 2 + 5 \cdot 1 & 1 \cdot 4 + 5 \cdot 1 \\ 2 \cdot 2 + 0 \cdot 1 & 2 \cdot 4 + 0 \cdot 1 \end{bmatrix} = \begin{bmatrix} 10 & 16 \\ 7 & 9 \\ 4 & 8 \end{bmatrix} \]
열×행 방법 (랭크 1 행렬 2개의 합):
\[ AB = \begin{bmatrix} 3 \\ 1 \\ 2 \end{bmatrix}\begin{bmatrix} 2 & 4 \end{bmatrix} + \begin{bmatrix} 4 \\ 5 \\ 0 \end{bmatrix}\begin{bmatrix} 1 & 1 \end{bmatrix} = \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} \]
곱셈 횟수(\(3 \times 2 \times 2 = 12\) 번)는 같다. 순서만 다르다.
8.2 예시 2: 교환 법칙 성립 조건 탐색
\[ A = \begin{bmatrix} p & 0 \\ q & r \end{bmatrix},\quad B = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \]
\(AB\) 와 \(BA\) 를 계산한다.
\[ AB = \begin{bmatrix} p & p \\ q+r & r+q... \end{bmatrix} = \begin{bmatrix} p & p \\ q & r \end{bmatrix}\begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} p & p \\ q & q+r \end{bmatrix} \]
\[ BA = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}\begin{bmatrix} p & 0 \\ q & r \end{bmatrix} = \begin{bmatrix} p+q & r \\ q & r \end{bmatrix} \]
\(AB = BA\) 이 되려면 \(p = p+q\) (→ \(q = 0\))이고 \(q+r = r\) (→ \(q = 0\))이어야 한다. 즉 \(q = 0\) 이어야 한다. \(A\) 가 대각 행렬일 때만 이 \(B\) 와 교환된다.
8.3 예시 3: 인접 행렬과 경로 수
방향 그래프에서 \(a_{ij} = 1\) (노드 \(i \to j\) 간선 존재), \(a_{ij} = 0\) (없음)으로 정의하면:
\[ A = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix} \quad \text{(노드 1→1, 1→2, 2→1 간선)} \]
\((A^2)_{ij}\) 는 2단계 경로의 수이다. 왜인가?
\[ (A^2)_{ij} = \sum_k a_{ik} a_{kj} \]
\(a_{ik} a_{kj} = 1\) iff 노드 \(i \to k\) 간선과 \(k \to j\) 간선이 모두 존재. 이 중간 노드 \(k\) 들의 합이 2단계 경로의 총수이다.
\[ A^2 = \begin{bmatrix} 1 & 1 \\ 1 & 0 \end{bmatrix}^2 = \begin{bmatrix} 2 & 1 \\ 1 & 1 \end{bmatrix} \]
\((A^2)_{11} = 2\): 노드 1에서 노드 1로의 2단계 경로는 \(1 \to 1 \to 1\), \(1 \to 2 \to 1\) 두 가지이다.
일반적으로 \((A^k)_{ij}\) 는 노드 \(i\) 에서 \(j\) 까지 \(k\) 단계 경로의 수이다. 행렬 거듭제곱이 경로 계산과 동치라는 아름다운 결과이다.
9 ML/DL에서의 연결
9.1 배치 처리 — 열 방법의 대규모 적용
딥러닝의 행렬 곱 \(Y = WX\) 에서:
- \(W\): 가중치 행렬 (\(d_{\text{out}} \times d_{\text{in}}\))
- \(X = [x_1 \; x_2 \; \cdots \; x_B]\): 배치 입력 (\(d_{\text{in}} \times B\))
열 방법으로 보면 \(WX\) 의 \(j\) 번째 열 = \(Wx_j\) = \(j\) 번째 샘플의 출력. 배치 처리는 \(B\) 개의 \(Wx_j\) 를 열로 붙인 것이다.
9.2 어텐션 — 내적 방법의 응용
트랜스포머의 어텐션은 행렬 \(Q, K, V\) 로 구성된다.
\[ \text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right) V \]
\(QK^\top\) 는 내적 방법의 행렬 곱이다. \((QK^\top)_{ij}\) = \(Q\) 의 \(i\) 번째 쿼리 벡터와 \(K\) 의 \(j\) 번째 키 벡터의 내적 = 두 위치의 유사도(attention score).
9.3 SVD — 열×행 방법의 정점
열×행 방법에서 \(AB = \sum_k a_k b_k^\top\) 는 SVD의 직관적 전조이다.
\[ M = \sigma_1 u_1 v_1^\top + \sigma_2 u_2 v_2^\top + \cdots + \sigma_r u_r v_r^\top \]
\(M\) 을 랭크 1 행렬들의 합으로 표현하되, 각 항의 “크기”(\(\sigma_k\))가 감소하는 순으로 배열한 것이 SVD이다. 처음 \(k\) 개 항만 유지하면 최적의 랭크 \(k\) 근사가 된다.
10 코드로 확인하기
10.1 Step 1 — 네 가지 곱셈 방법 구현
import numpy as np
A = np.array([[3, 4], [1, 5], [2, 0]], dtype=float)
B = np.array([[2, 4], [1, 1]], dtype=float)
# 방법 1: 내적 (표준)
AB_standard = A @ B
print("방법 1 (표준):\n", AB_standard)
# 방법 2: 열 방법
m, n = A.shape
_, p = B.shape
AB_col = np.column_stack([A @ B[:, j] for j in range(p)])
print("방법 2 (열):\n", AB_col)
# 방법 3: 행 방법
AB_row = np.vstack([A[i, :] @ B for i in range(m)])
print("방법 3 (행):\n", AB_row)
# 방법 4: 열×행 (랭크 1 합)
AB_outer = sum(np.outer(A[:, k], B[k, :]) for k in range(n))
print("방법 4 (열×행):\n", AB_outer)
# 모두 같아야 함
assert np.allclose(AB_standard, AB_col)
assert np.allclose(AB_standard, AB_row)
assert np.allclose(AB_standard, AB_outer)
print("모든 방법 일치!")10.2 Step 2 — 블록 곱셈 검증
import numpy as np
# 4×4 행렬을 2×2 블록으로 분할
A = np.random.randint(1, 5, (4, 4)).astype(float)
B = np.random.randint(1, 5, (4, 4)).astype(float)
# 블록 분할
A11, A12 = A[:2, :2], A[:2, 2:]
A21, A22 = A[2:, :2], A[2:, 2:]
B11, B12 = B[:2, :2], B[:2, 2:]
B21, B22 = B[2:, :2], B[2:, 2:]
# 블록 곱셈 결과
AB_block = np.block([
[A11@B11 + A12@B21, A11@B12 + A12@B22],
[A21@B11 + A22@B21, A21@B12 + A22@B22]
])
AB_direct = A @ B
print("블록 곱셈 == 직접 곱셈?", np.allclose(AB_block, AB_direct))
# 인접 행렬 경로 계산
Adj = np.array([[1, 1], [1, 0]], dtype=float)
print("1단계 경로 수 (A):\n", Adj)
print("2단계 경로 수 (A^2):\n", Adj @ Adj)
print("3단계 경로 수 (A^3):\n", Adj @ Adj @ Adj)11 핵심 요약
- 모양 조건: \((m \times n)(n \times p) = (m \times p)\) — \(A\) 의 열 수 = \(B\) 의 행 수.
- 네 가지 관점: 내적 / 열 / 행 / 열×행(외적 합) — 모두 동일한 결과, 다른 통찰.
- 성립하는 법칙: 덧셈 교환·분배·결합, 곱셈 분배·결합.
- 깨지는 법칙: \(AB \neq BA\) — 변환 순서가 결과를 바꾼다.
- 블록 곱셈: 열-행 분할이 맞으면 블록끼리 곱하면 된다.
- 슈어 여인수: 블록 소거의 결과 \(S = D - CA^{-1}B\) — 이후 단계의 피벗 블록.