01단원에서 평면 하나를 일차방정식 하나로 적었습니다.
그런데 평면이 여럿이면 어떻게 됩니까. 세 평면이 만나는 점을 찾는 것은 방정식 세 개를 동시에 만족하는 를 찾는 일입니다. 연립일차방정식입니다.
방정식이 셋이고 미지수가 셋이면 손으로 풀 만합니다. 그런데 실제 문제에서는 수천 개, 수백만 개가 되기도 합니다. 그때는 방정식을 하나씩 적는 것부터 불가능하므로 정리하는 틀이 필요합니다.
그 틀이 행렬입니다. 계수만 뽑아 표로 만들면 방정식 전체가 하나의 식이 됩니다.
여기까지는 그저 표기의 절약입니다. 이 강의의 진짜 목적은 그다음입니다. 를 표가 아니라 벡터를 벡터로 옮기는 사상으로 읽는 것입니다. 그 관점을 세우면 행렬 곱셈의 이상해 보이는 규칙이 "두 변환을 이어서 하는 것"으로 자연스럽게 설명되고, 78강의 행렬식이 왜 부피인지, 84강의 고유값이 무엇인지가 그 위에서 이해됩니다.
문제. 다음 연립방정식을 봅니다.
(1) 계수를 표로 뽑아 정리하세요.
(2) 왼쪽을 벡터의 일차결합으로 다시 쓰세요.
(3) (2)의 관점에서 이 방정식이 묻는 것은 무엇입니까?
생각의 실마리. (2)에서 가 곱해지는 것들을 모으고 가 곱해지는 것들을 모아 봅니다. 미지수마다 벡터가 하나씩 나옵니다. 62강 문제 4에서 일차결합을 다룰 때 정확히 같은 구조를 보았습니다.
풀이. (1) 계수를 행 순서대로 뽑습니다.
이렇게 두면 방정식이 한 줄이 됩니다.
(2) 왼쪽을 와 로 묶습니다.
의 열들이 나타났습니다.
(3) 이 방정식은 다음을 묻습니다.
의 열벡터들을 어떻게 조합해야 가 되는가.
62강의 언어로 하면 가 열들의 생성 집합에 있는지, 있다면 계수가 무엇인지를 묻는 것입니다.
이 문제에서 배우는 것: 행렬과 벡터의 곱.
행렬-벡터 곱. 의 열을 이라 하면
입니다. 즉 열들의 일차결합이며 계수가 의 성분입니다.
이 관점이 이 과목 전체에서 가장 자주 쓰입니다. 성분으로 계산할 때는 다른 공식을 쓰지만, 무엇을 하고 있는지 이해할 때는 언제나 열의 일차결합으로 읽어야 합니다.
성분 공식도 적어 둡니다. 가 이고 가 차원이면 결과는 차원이고
입니다. 번째 행과 의 내적이므로 63강의 내적으로도 읽힙니다.
두 관점을 비교합니다.
| 관점 | 읽는 법 | 유리한 곳 |
|---|---|---|
| 열의 일차결합 | 열들을 조합합니다 | 구조 이해, 해의 존재 |
| 행과의 내적 | 행마다 내적합니다 | 손계산, 성분 확인 |
전자가 이 과목의 기본 관점입니다. 후자는 계산 도구입니다.
크기 규칙도 정리합니다. 가 이면 입력이 차원이고 출력이 차원입니다.
행렬이 벡터를 벡터로 옮기는 사상이라는 관점의 첫 등장입니다. 문제 5에서 본격적으로 다룹니다.
바로 확인 1.
확인 1-1. 를 열의 일차결합으로 계산하세요.
답. 입니다.
확인 1-2. 가 행렬일 때 의 와 결과의 차원을 쓰세요.
답. 는 차원이고 결과는 차원입니다.
확인 1-3. 가 해를 가질 조건을 열의 언어로 쓰세요.
답. 가 의 열들이 생성하는 집합 안에 있어야 합니다.
문제. 두 변환을 이어서 적용하는 상황을 봅니다.
(1) 에 를 적용한 뒤 를 적용한 결과를 쓰세요.
(2) 그것을 하나의 행렬로 나타낼 수 있습니까?
(3) 그 행렬의 성분을 와 의 성분으로 구하세요.
생각의 실마리. (2)에서 두 번의 적용이 결국 벡터를 벡터로 옮기는 하나의 사상이므로 행렬 하나로 적을 수 있으리라 기대합니다. (3)에서는 그 행렬의 열이 무엇인지 보면 됩니다. 번째 열은 를 넣었을 때의 결과입니다.
풀이. (1) 순서대로 적용하면 입니다.
(2) 있습니다. 그 행렬을 로 쓰기로 하고 다음을 요구합니다.
곱셈을 이렇게 정의하면 합성이 곱이 됩니다.
(3) 의 번째 열을 구하려면 를 넣습니다. 는 의 번째 열 이므로
입니다. 문제 1의 공식으로 성분을 쓰면
입니다.
이 문제에서 배우는 것: 행렬 곱셈.
행렬 곱셈. 가 이고 가 일 때
이고 는 입니다.
**"번째 행과 번째 열의 내적"**이 성분 공식이며, 그 유래가 합성이라는 점이 중요합니다. 곱셈 규칙이 임의로 정해진 것이 아닙니다.
크기가 맞아야 하는 이유도 분명합니다. 가 이고 가 이어야 이어 붙일 수 있으므로, 의 행 수와 의 열 수가 같아야 합니다.
곱셈을 읽는 방법이 여럿입니다.
| 관점 | 읽는 법 |
|---|---|
| 성분 | 행과 열의 내적 |
| 열 | 의 열은 A\mathbf{b}_ |
| 행 | 의 행은 |
| 합성 | 두 변환을 이어서 합니다 |
| 외적의 합 | \sum_{k}(\text{A$의 열})(\text{의 행})$ |
넷째가 가장 근본적이고 다섯째는 88강의 특이값 분해에서 결정적입니다. 심화 1에서 다섯 관점을 모두 확인합니다.
와 가 다르다는 점도 여기서 보입니다. 변환을 어느 순서로 적용하느냐가 결과를 바꾸기 때문입니다. 회전한 뒤 늘리는 것과 늘린 뒤 회전하는 것은 다릅니다. 문제 3에서 반례를 봅니다.
바로 확인 2.
확인 2-1. 가 이고 가 일 때 의 크기를 쓰세요.
답. 입니다.
확인 2-2. 가 정의됩니까?
답. 되지 않습니다. 의 열 수 와 의 행 수 가 다릅니다.
확인 2-3. 의 번째 열을 의 열로 나타내세요.
답. 입니다. 의 번째 열에 를 적용한 것입니다.
문제. 다음을 판정하고 거짓이면 반례를 드세요.
(1)
(2) 이면 또는
(3) 이고 이면
(4) 이면
생각의 실마리. 네 명제 모두 실수에서는 참입니다. 행렬에서는 모두 거짓이며, 반례를 찾는 것이 이 문제의 목적입니다. 성분이 이 많은 간단한 행렬로 시도해 보면 금방 나옵니다.
풀이. (1) 거짓입니다.
(2) 거짓입니다.
둘 다 영행렬이 아닌데 곱이 영행렬입니다.
(3) 거짓입니다. (2)의 예에서 , , 로 두면 인데 입니다.
(4) 거짓입니다.
인데 제곱이 영행렬입니다.
이 문제에서 배우는 것: 성립하는 것과 안 하는 것.
성립하는 성질부터 정리합니다.
| 성질 | 식 |
|---|---|
| 결합법칙 | |
| 분배법칙 | , |
| 스칼라 | |
| 항등원 | |
| 덧셈 | 성분별이며 교환·결합법칙 성립 |
결합법칙이 성립하는 이유는 곱이 합성이기 때문입니다. 세 변환을 이어서 하는 것은 어떻게 묶어도 같습니다.
이제 성립하지 않는 것들입니다.
| 명제 | 실수에서 | 행렬에서 | 반례 |
|---|---|---|---|
| 참 | 거짓 | 문제 3의 (1) | |
| 또는 | 참 | 거짓 | 대각 성분이 어긋난 두 행렬 |
| 참 | 거짓 | 소거법칙 실패 | |
| 참 | 거짓 | \begin{pmatrix}0&1\\ 0&0\end |
둘째 줄의 현상을 영인자라 합니다. 영이 아닌 두 원소의 곱이 영이 되는 것인데, 실수에서는 일어나지 않습니다. 셋째 줄의 소거법칙 실패가 여기서 따라옵니다. 에서 인데 영인자가 있으면 이라고 결론지을 수 없습니다.
넷째 줄처럼 이 되는 행렬을 멱영행렬이라 합니다. 85강에서 대각화가 불가능한 행렬을 다룰 때 다시 나옵니다.
이 반례들이 왜 중요한지를 짚어 둡니다. 행렬을 "숫자 비슷한 것"으로 다루면 반드시 틀립니다. 특히 방정식을 정리할 때 양변에서 같은 행렬을 소거하는 조작은 69강의 역행렬이 있을 때만 허용됩니다.
곱셈이 교환법칙을 만족하지 않는 것은 결함이 아니라 의미가 있습니다. 회전과 반사, 확대와 전단은 순서에 따라 결과가 다르며, 그 차이가 실제 현상입니다. 곱셈이 교환적이라면 오히려 변환을 표현하지 못했을 것입니다.
바로 확인 3.
확인 3-1. 가 일반적으로 거짓인 이유를 변환의 언어로 쓰세요.
답. 두 변환을 어느 순서로 적용하느냐에 따라 결과가 다르기 때문입니다.
확인 3-2. 영인자의 예를 하나 드세요.
답. 과 이며 곱이 영행렬입니다.
확인 3-3. 에서 를 소거하면 안 되는 이유를 쓰세요.
답. 에서 영인자 때문에 이라고 결론지을 수 없기 때문입니다.
문제. 을 의 행과 열을 맞바꾼 행렬이라 합니다.
(1) 을 과 으로 나타내세요.
(2) 순서가 왜 그렇게 됩니까?
(3) 의 특징을 말하세요.
생각의 실마리. (1)은 성분으로 확인하면 됩니다. 전치는 지표를 바꾸는 것이므로 곱의 정의에 넣어 보면 순서가 드러납니다. (3)에서는 크기부터 확인하고 그다음 대칭성을 봅니다.
풀이. (1) 성분으로 계산합니다.
따라서
순서가 뒤집힙니다.
(2) 크기를 보면 자연스럽습니다. 가 , 가 이면 는 이고 은 입니다. 그런데 은 이고 은 이므로 의 순서로만 곱이 정의됩니다.
(3) 가 이면 는 입니다. 그리고
이므로 언제나 대칭행렬입니다.
이 문제에서 배우는 것: 전치의 성질.
전치의 성질.
성질 식 두 번 합 (A+B)^{\top}=A^{\top}+B^ 스칼라 (cA)^{\top}=cA^ 곱 (AB)^{\top}=B^{\top}A^ 대칭 인 행렬 언제나 대칭이고
곱에서만 순서가 뒤집힙니다. 이 사실이 뒤에서 계속 쓰이며, 82강의 정규방정식 가 그 대표적인 예입니다.
전치와 내적의 관계도 중요합니다. 63강의 내적을 행렬 곱으로 적으면
이고, 이를 쓰면 전치의 의미가 드러납니다.
를 왼쪽에서 오른쪽으로 옮기면 전치가 됩니다. 이 관계가 76강 이후 선형변환을 다룰 때 수반 사상의 정의가 되며, 86강의 스펙트럼 정리에서 대칭행렬이 특별한 이유도 여기서 나옵니다.
가 대칭이라는 사실도 뒤에서 크게 쓰입니다. 82강에서 최소제곱 문제가 이 행렬로 귀착되고, 87강에서 그것이 양반정치임을 보이며, 88강의 특이값 분해가 그 고유값에서 나옵니다.
바로 확인 4.
확인 4-1. 을 전치로 나타내세요.
답. 입니다.
확인 4-2. 가 일 때 와 의 크기를 쓰세요.
답. 각각 와 입니다.
확인 4-3. 를 으로 나타내세요.
답. 입니다.
문제. 다음 행렬이 평면을 어떻게 옮기는지 설명하세요.
(1)
(2)
(3) P=\begin{pmatrix}1&0\\ 0&0\end
생각의 실마리. 문제 1에서 가 의 번째 열이라고 했습니다. 기저벡터가 어디로 가는지 보면 변환이 결정됩니다. 나머지 벡터는 일차결합이므로 자동으로 따라옵니다.
풀이. (1) 열을 봅니다. 이고 입니다. 두 기저벡터가 각각 만큼 회전했습니다.
길이도 확인합니다. 임의의 에 대해
인데 이므로 입니다. 회전은 길이를 보존합니다.
(2) 이고 입니다. 방향으로 두 배, 방향으로 세 배 늘립니다. 정사각형이 직사각형이 되며 넓이가 여섯 배가 됩니다.
(3) 이고 입니다. 모든 점을 축으로 눌러붙입니다. 64강의 정사영이며 실제로 입니다.
이 문제에서 배우는 것: 행렬은 변환입니다.
행렬을 읽는 법. 의 번째 열은 , 즉 번째 기저벡터가 옮겨 가는 자리입니다.
이 한 문장이 이 과목의 중심 관점입니다. 행렬을 보면 열을 하나씩 읽어 기저가 어디로 가는지 확인하는 습관을 들여야 합니다.
대표적인 변환들을 정리합니다.
| 행렬 | 변환 | 특징 |
|---|---|---|
| 항등 | 아무것도 안 합니다 | |
| \begin{pmatrix}\cos\theta&-\sin\theta\\ \sin\theta&\cos\theta\end | 회전 | 길이와 각도를 보존 |
| \begin{pmatrix}a&0\\ 0&d\end | 축 방향 확대 | 넓이가 배 |
| \begin{pmatrix}1&k\\ 0&1\end | 전단 | 넓이 보존, 기울입니다 |
| \begin{pmatrix}1&0\\ 0&-1\end | 반사 | 방향이 뒤집힙니다 |
| \begin{pmatrix}1&0\\ 0&0\end | 정사영 | 차원이 줄어듭니다 |
마지막 줄이 특별합니다. 다른 변환들은 되돌릴 수 있는데 정사영은 정보를 잃어 되돌릴 수 없습니다. 성분이 무엇이었든 결과가 같아지므로, 결과에서 원래를 복원할 방법이 없습니다. 69강에서 이것이 "역행렬이 없다"는 조건과 같음을 봅니다.
넓이 변화도 눈여겨보십시오. 확대는 배, 전단은 그대로, 정사영은 입니다. 이 값이 78강의 행렬식이며, 79강에서 그 기하적 의미를 정식으로 다룹니다.
곱셈이 합성이라는 사실도 여기서 실감됩니다. 는 먼저 늘리고 그다음 회전하는 변환입니다. 은 순서가 반대이므로 결과가 다르고, 그것이 문제 3에서 본 비교환성의 기하적 정체입니다.
바로 확인 5.
확인 5-1. 의 번째 열이 무엇을 뜻하는지 쓰세요.
답. 번째 기저벡터가 옮겨 가는 자리, 즉 입니다.
확인 5-2. 이 어떤 변환인지 말하세요.
답. 전단입니다. 은 제자리이고 가 로 기울어집니다.
확인 5-3. 와 이 다른 이유를 기하적으로 설명하세요.
답. 늘린 뒤 회전하는 것과 회전한 뒤 늘리는 것이 다른 결과를 주기 때문입니다.
| 연산 | 정의 |
|---|---|
| 행렬-벡터 곱 | (열의 일차결합) |
| 성분 공식 | (A\mathbf{x})_{i}=\sum_{j}a_{ij}x_ |
| 행렬 곱 | (AB)_{ij}=\sum_{k}a_{ik}b_ |
| 곱의 뜻 | 변환의 합성, |
| 전치 | 행과 열을 맞바꿉니다 |
| 성립하는 성질 | 식 |
|---|---|
| 결합 | |
| 분배 | |
| 항등원 | |
| 전치의 곱 | (AB)^{\top}=B^{\top}A^ |
| 언제나 대칭 |
| 성립하지 않는 성질 | 반례 |
|---|---|
| 대부분의 두 행렬 | |
| 하나가 | 영인자 |
| 소거법칙 | 여도 |
| 멱영행렬 |
| 변환 | 행렬 |
|---|---|
| 회전 | \begin{pmatrix}\cos\theta&-\sin\theta\\ \sin\theta&\cos\theta\end |
| 확대 | \begin{pmatrix}a&0\\ 0&d\end |
| 전단 | \begin{pmatrix}1&k\\ 0&1\end |
| 정사영 | \begin{pmatrix}1&0\\ 0&0\end |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 로 씁니다 | 순서를 지켜야 합니다 |
| 양변에서 행렬을 소거합니다 | 역행렬이 있을 때만 됩니다 |
| (AB)^{\top}=A^{\top}B^ | 순서가 뒤집힙니다 |
| 크기를 확인하지 않고 곱합니다 | 안쪽 크기가 맞아야 합니다 |
문제 6. 을 계산하세요.
답. 입니다.
문제 7. 를 계산하세요.
답. 입니다.
문제 8. 문제 7의 두 행렬을 순서 바꿔 곱하세요.
답. 이며 문제 7과 다릅니다.
문제 9. 가 이고 가 일 때 의 크기를 쓰세요.
답. 입니다.
문제 10. 가 일 때 의 크기와 성질을 쓰세요.
답. 이고 대칭입니다.
문제 11. 을 전치로 나타내세요.
답. 입니다.
문제 12. 이지만 인 행렬을 하나 드세요.
답. 입니다.
문제 13. 이 어떤 변환인지 말하고 을 구하세요.
답. 축으로의 정사영이며 입니다.
문제 14. 인 회전행렬을 쓰세요.
답. 입니다.
문제 15. 회전행렬이 길이를 보존하는 근거를 쓰세요.
답. 이므로 입니다.
문제 16. 가 해를 가질 조건을 열의 언어로 쓰세요.
답. 가 의 열들이 생성하는 집합 안에 있어야 합니다.
문제 17. 의 번째 열을 의 열로 나타내세요.
답. 입니다.
문제 18. 행렬 곱셈이 결합법칙을 만족하는 이유를 변환의 언어로 쓰세요.
답. 세 변환을 이어서 적용하는 것은 어떻게 묶어도 같은 결과를 주기 때문입니다.
심화 1. 행렬 곱셈을 다섯 가지 관점으로 읽고 각각이 유용한 곳을 밝히세요.
풀이. 가 , 가 일 때 를 다섯 가지로 읽습니다.
첫째, 성분입니다.
손계산의 표준이며 작은 행렬에서 씁니다.
둘째, 열로 읽습니다.
의 각 열에 를 적용한 것입니다. 문제 2에서 곱셈을 유도할 때 쓴 관점이며, 여러 벡터를 한꺼번에 변환할 때 자연스럽습니다.
셋째, 행으로 읽습니다.
의 각 행이 의 행들을 조합합니다. 67강의 가우스 소거법에서 행 연산을 행렬 곱으로 적을 때 이 관점을 씁니다.
넷째, 합성입니다.
가장 근본적인 관점이며 결합법칙과 비교환성이 여기서 설명됩니다.
다섯째, 외적의 합입니다.
여기서 는 의 번째 열이고 는 의 번째 행입니다. 각 항이 행렬이며 계수가 인 행렬입니다.
이 관점이 88강의 특이값 분해에서 결정적입니다. 행렬을 계수 짜리 조각들의 합으로 보면, 큰 조각 몇 개만 남겨 근사할 수 있습니다. 그것이 89강의 저계수 근사이고 주성분분석입니다.
다섯 관점을 언제 쓰는지 정리합니다.
| 관점 | 쓰는 곳 |
|---|---|
| 성분 | 손계산 |
| 열 | 여러 벡터를 한꺼번에 변환 |
| 행 | 행 연산, 가우스 소거 |
| 합성 | 구조 이해, 성질 증명 |
| 외적의 합 | 분해와 근사 |
심화 2. 영인자가 존재하는 것이 왜 소거법칙을 무너뜨리는지 설명하고, 언제 소거해도 되는지 밝히세요.
풀이. 실수에서 이고 이면 입니다. 증명은 이렇습니다.
마지막 단계에서 **"두 수의 곱이 이면 하나가 "**을 썼습니다. 실수에는 영인자가 없으므로 성립합니다.
행렬에서는 이 단계가 막힙니다. 이어도 와 가 모두 영행렬이 아닐 수 있습니다. 문제 3의 반례가 그 경우입니다.
언제 소거해도 되는가. 가 역행렬을 가지면 됩니다.
역행렬을 오른쪽에서 곱한 것이며, 순서를 지켜야 합니다. 처럼 잘못 곱하면 결론이 나오지 않습니다.
이 조건이 69강의 주제입니다. 어떤 행렬이 역행렬을 가지는지가 그 강의의 중심 질문이며, 정사영처럼 정보를 잃는 변환은 되돌릴 수 없으므로 역행렬도 없습니다.
영인자와 변환의 관계도 짚어 둡니다. 이라는 것은 가 옮긴 결과가 모두 에 의해 으로 눌린다는 뜻입니다. 문제 3의 예에서 는 모든 것을 축으로 보내고 는 축을 으로 보내므로 합성이 영변환입니다. 두 변환이 각각은 무언가를 하는데 이어 붙이면 아무것도 남지 않습니다.
이 현상이 74강의 영공간과 열공간에서 정확히 기술됩니다. 은 "의 열공간이 의 영공간에 들어 있다"는 뜻입니다.
심화 3. 블록 행렬의 곱셈이 성립함을 확인하고 그 이점을 설명하세요.
풀이. 행렬을 사각형 조각으로 나눈 것을 블록 행렬이라 합니다. 예를 들어
에서 가 각각 행렬입니다.
놀라운 사실은 블록을 성분처럼 다뤄도 곱셈이 맞는다는 것입니다.
단 크기가 맞아야 하고 블록끼리의 곱에서 순서를 지켜야 합니다. 이지 가 아닙니다.
성립하는 이유는 곱셈의 정의가 합의 분배로 이루어지기 때문입니다. 성분 하나를 계산할 때 더하는 항들을 블록 단위로 묶어도 결과가 같습니다.
이점이 여럿입니다.
| 이점 | 내용 |
|---|---|
| 구조 노출 | 특별한 모양이 겉으로 드러납니다 |
| 계산 절약 | 영블록은 계산하지 않습니다 |
| 병렬화 | 블록마다 따로 계산할 수 있습니다 |
| 메모리 | 캐시에 맞는 크기로 자릅니다 |
넷째가 실무에서 특히 중요합니다. 큰 행렬을 곱할 때 전체를 메모리에 올릴 수 없으므로 블록으로 잘라 처리하며, 306강의 플래시어텐션이 정확히 그 기법입니다. 어텐션 행렬을 통째로 만들지 않고 블록 단위로 계산해 메모리를 아낍니다.
간단한 예로 대각블록 행렬을 봅니다.
두 문제가 완전히 분리됩니다. 85강에서 대각화를 다룰 때 이 구조를 만드는 것이 목표가 됩니다.
심화 4. 행렬의 거듭제곱으로 점화식을 푸는 방법을 보이세요.
풀이. 피보나치 수열 , 을 봅니다. 32강에서 특성방정식으로 풀었는데 여기서는 행렬로 합니다.
연속한 두 항을 벡터로 묶습니다.
그러면 한 걸음 나아가는 것이 행렬 곱입니다.
이 행렬을 라 하면
입니다. 점화식이 행렬의 거듭제곱이 되었습니다.
를 계산해 보면 규칙이 보입니다.
성분이 모두 피보나치 수입니다. 검산에서 이 로 확인됩니다.
이 방법의 실용적 가치는 계산량에 있습니다. 을 정의대로 구하면 번의 덧셈이 필요하지만, 거듭제곱을 반복제곱법으로 하면 번의 행렬 곱으로 끝납니다.
| 방법 | 계산량 |
|---|---|
| 점화식 반복 | |
| 행렬 거듭제곱 |
96강 이후 알고리즘에서 이 기법이 다시 나옵니다.
더 중요한 것은 이 관점이 84강으로 이어진다는 점입니다. 을 빠르게 계산하려면 를 대각화하면 되고, 그때 나오는 고유값이 입니다. 32강에서 특성방정식의 근이라 부른 것이 실은 이 행렬의 고유값이었습니다. 85강에서 두 관점이 하나로 묶입니다.
심화 5. 대각합의 성질을 정리하고 를 증명하세요.
풀이. 정사각행렬의 대각 성분을 모두 더한 것을 대각합이라 합니다.
성질을 봅니다.
| 성질 | 식 |
|---|---|
| 선형성 | |
| 스칼라 | |
| 전치 | |
| 순환 |
넷째가 놀랍습니다. 인데도 대각합은 같습니다.
증명은 짧습니다.
합의 순서를 바꾼 것이 전부입니다. 31강의 이중합 조작입니다.
검산에서 와 가 모두 입니다. 앞서 본 대로 두 곱은 서로 다른 행렬인데 대각합은 같습니다.
이 성질의 응용이 여럿입니다.
| 응용 | 내용 |
|---|---|
| 닮음 불변 | |
| 고유값의 합 | 대각합이 고유값의 합입니다 |
| 프로베니우스 내적 | |
| 정사영의 차원 | 64강 심화 2에서 대각합이 이었습니다 |
첫 줄이 77강의 닮음에서 쓰입니다. 순환 성질에서 이므로, 기저를 바꿔도 대각합이 변하지 않습니다. 그래서 대각합은 좌표에 무관한 양이며 둘째 줄처럼 고유값과 이어집니다.
셋째 줄은 63강 심화 2에서 행렬 공간의 내적으로 이미 나왔습니다. 이므로 성분을 늘어놓고 내적한 것과 같습니다.
심화 6. 행렬 곱의 계산량을 세고 더 빠른 방법이 있는지 논하세요.
풀이. 행렬 두 개를 정의대로 곱하면 성분이 개이고 각각 번의 곱셈이 필요하므로
입니다. 이면 번이고 이면 번입니다.
더 빠른 방법이 있습니다. 의 경우를 봅니다. 정의대로는 곱셈이 번인데, 스트라센은 번으로 줄이는 방법을 찾았습니다. 덧셈이 늘어나는 대신 곱셈 하나를 아낍니다.
이것을 재귀적으로 적용하면 의 계산량이
이 됩니다. 96강에서 배울 분할정복이며, 60강 심화 6의 FFT와 같은 구조입니다.
| 방법 | 계산량 |
|---|---|
| 정의대로 | |
| 스트라센 | |
| 현재 최선(이론) | 근처 |
| 하한 | (성분을 다 읽어야 하므로) |
셋째 줄은 이론적 결과이고 실용적이지 않습니다. 상수가 너무 커서 천문학적인 크기에서만 이득이 나기 때문입니다.
실무에서는 다른 곳에서 이득을 봅니다.
| 기법 | 내용 |
|---|---|
| 블록화 | 캐시에 맞춰 잘라 메모리 접근을 줄입니다 |
| 병렬화 | 여러 코어나 GPU에 나눕니다 |
| 희소성 | 이 많으면 건너뜁니다 |
| 저정밀도 | 반정밀도로 계산해 처리량을 늘립니다 |
행렬 곱이 현대 계산의 병목이라는 점을 알아 두십시오. 219강 이후 신경망 학습의 계산량 대부분이 행렬 곱이며, GPU가 그것을 빠르게 하려고 설계된 장치입니다. 92강에서 저정밀도 계산의 위험을 다루고, 429강에서 부동소수점 형식을 자세히 봅니다.
이 강의에서는 numpy만 씁니다. 행렬 연산은 @ 연산자로 계산되므로 검산이 직접적입니다. 성질이 성립하는지, 그리고 성립하지 않는 것의 반례가 실제로 반례인지를 확인하는 것이 목적입니다.
import numpy as np
A = np.array([[1.0, 2.0], [3.0, 4.0]])
B = np.array([[0.0, 1.0], [-1.0, 2.0]])
C = np.array([[2.0, 0.0], [1.0, -1.0]])
# --- 문제 1: 행렬과 벡터의 곱은 열의 일차결합 ---------------------------
x = np.array([3.0, -1.0])
print((A @ x).tolist(), (3*A[:,0] - 1*A[:,1]).tolist()) # [1.0, 5.0] [1.0, 5.0]
# --- 문제 2: 합성이 곱셈 ------------------------------------------------
print((A @ (B @ x)).tolist(), ((A @ B) @ x).tolist())
# [-11.0, -23.0] [-11.0, -23.0]
print((A @ B).tolist()) # [[-2.0, 5.0], [-4.0, 11.0]]
print((B @ A).tolist()) # [[3.0, 4.0], [5.0, 6.0]]
# --- 문제 3: 성립하는 것과 반례 ------------------------------------------
print(bool(np.allclose((A @ B) @ C, A @ (B @ C)))) # True (결합)
print(bool(np.allclose(A @ (B + C), A @ B + A @ C))) # True (분배)
print(bool(np.allclose(A @ B, B @ A))) # False (비교환)
Z1 = np.array([[1.0, 0.0], [0.0, 0.0]]); Z2 = np.array([[0.0, 0.0], [0.0, 1.0]])
print((Z1 @ Z2).tolist()) # [[0.0, 0.0], [0.0, 0.0]] (영인자)
N = np.array([[0.0, 1.0], [0.0, 0.0]])
print((N @ N).tolist()) # [[0.0, 0.0], [0.0, 0.0]] (멱영)
D = np.array([[1.0, 1.0], [0.0, 0.0]]); E = np.array([[1.0, 1.0], [-1.0, -1.0]])
print((D @ E).tolist(), (D @ np.zeros((2, 2))).tolist())
# [[0.0, 0.0], [0.0, 0.0]] [[0.0, 0.0], [0.0, 0.0]]
# DE = DO 인데 E != O 이므로 왼쪽에서도 소거할 수 없습니다
# --- 문제 4: 전치 -------------------------------------------------------
print(bool(np.allclose((A @ B).T, B.T @ A.T))) # True
print(bool(np.allclose((A @ B).T, A.T @ B.T))) # False (순서 주의)
print((A.T @ A).tolist(), bool(np.allclose(A.T @ A, (A.T @ A).T)))
# [[10.0, 14.0], [14.0, 20.0]] True
# --- 문제 5: 행렬을 변환으로 읽기 ---------------------------------------
th = np.pi/6
R = np.array([[np.cos(th), -np.sin(th)], [np.sin(th), np.cos(th)]])
print(["%.8f" % z for z in R @ np.array([1.0, 0.0])],
"%.8f %.8f" % (np.cos(th), np.sin(th)))
# ['0.86602540', '0.50000000'] 0.86602540 0.50000000
print("%.8f" % float(np.linalg.norm(R @ np.array([2.0, 3.0]))),
"%.8f" % float(np.linalg.norm(np.array([2.0, 3.0]))))
# 3.60555128 3.60555128 (회전은 길이를 보존)
S = np.array([[2.0, 0.0], [0.0, 3.0]])
print((S @ np.array([1.0, 1.0])).tolist()) # [2.0, 3.0]
P = np.array([[1.0, 0.0], [0.0, 0.0]])
print((P @ np.array([4.0, 7.0])).tolist(), bool(np.allclose(P @ P, P)))
# [4.0, 0.0] True
# --- 심화 4: 거듭제곱과 피보나치 ----------------------------------------
F = np.array([[1.0, 1.0], [1.0, 0.0]])
for k in [1, 2, 5, 10]:
print(k, [int(round(z)) for z in np.linalg.matrix_power(F, k).flatten()])
# 1 [1, 1, 1, 0]
# 2 [2, 1, 1, 1]
# 5 [8, 5, 5, 3]
# 10 [89, 55, 55, 34]
# --- 심화 5: 대각합 -----------------------------------------------------
print(float(np.trace(A @ B)), float(np.trace(B @ A))) # 9.0 9.0
print(float(np.trace(A)), float(np.trace(B)), float(np.trace(A + B)))
# 5.0 2.0 7.0
실행하면 주석과 같은 값이 나옵니다. 다섯 곳을 짚어 둡니다.
첫째, 행렬-벡터 곱이 열의 일차결합과 정확히 같습니다. A @ x와 3*A[:,0] - 1*A[:,1]이 둘 다 입니다. 문제 1의 관점이 확인됩니다.
둘째, 합성과 곱이 같습니다. A @ (B @ x)와 (A @ B) @ x가 모두 입니다. 곱셈 정의의 유래가 이것입니다. 그 아래에서 와 가 완전히 다른 행렬임이 드러납니다.
셋째, 반례들이 모두 실제로 반례입니다. 영인자와 멱영행렬에서 곱이 영행렬이 됩니다. 마지막 줄은 소거법칙이 양쪽 모두에서 무너짐을 보입니다. 인데 이므로 왼쪽의 를 지울 수 없고, 문제 3의 (3)이 오른쪽의 경우였습니다. 네 명제가 실수에서는 참인데 행렬에서는 모두 거짓입니다.
넷째, 전치에서 순서가 결정적입니다. 은 True인데 은 False입니다. 그리고 가 으로 대칭입니다.
다섯째, 심화 4의 결과가 인상적입니다. 의 성분이 인데 모두 피보나치 수입니다. 점화식이 행렬 거듭제곱으로 옮겨졌고, 32강에서 특성방정식으로 푼 문제가 여기서 다른 언어로 나타납니다. 심화 5의 대각합도 인데 두 대각합이 모두 입니다.
코드로 할 수 없는 일도 분명히 해 둡니다. 성질을 몇 개의 행렬에서 확인한 것은 증명이 아닙니다. 결합법칙과 전치 공식은 모든 행렬에 대한 주장이므로 성분 계산으로 증명해야 합니다. 반면 반례는 하나만 있어도 충분하므로, 위의 False 출력들은 그 자체로 완결된 반증입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| A\mathbf | 행렬-벡터 곱 | 열의 일차결합입니다 |
| 행렬 곱 | 변환의 합성입니다 | |
| A^ | 전치 | 행과 열을 맞바꿉니다 |
| 단위행렬 | 곱셈의 항등원입니다 | |
| 영행렬 | 덧셈의 항등원입니다 | |
| 대각합 | 대각 성분의 합입니다 | |
| 영인자 | zero divisor | 곱이 영이 되는 영 아닌 원소입니다 |
| 멱영행렬 | nilpotent | 어떤 거듭제곱이 영행렬입니다 |
| 블록 행렬 | block matrix | 조각으로 나눈 행렬입니다 |
다음 67강에서는 연립방정식을 실제로 푸는 절차를 세웁니다. 이 강의에서 로 적기만 했는데, 그것을 푸는 체계적인 방법이 가우스 소거법입니다. 방정식을 다루기 쉬운 꼴로 바꾸는 세 가지 조작만 쓰며, 그 조작들이 각각 행렬 곱으로 표현된다는 사실이 70강의 LU 분해로 이어집니다.