Zen's Hermitage

[선형대수 01] 벡터와 행렬

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

프로그래머를 위한 선형대수 — 숫자를 공간으로 읽기 시작하는 순간

최근 AI를 비롯해 개발자로서 영역을 넓히기 시작하면서, 선형대수를 마주치는 일들이 많아졌다.

그래픽, AI, 알고리즘 등등 심화된 영역에 발을 들이기 위해서는 선형대수 공부가 필수적인 상황이었기에, 스터디를 꾸려 학습을 진행하게 되었다. 이 글은 그에 대한 학습 기록이다.

이번에 학습하는 책은 **『프로그래머를 위한 선형대수』**다. 이 책의 가장 인상적인 점은, 데이터를 단순히 “숫자의 조합”으로만 다루지 않는다는 데 있다. 책은 처음부터 끝까지 일관되게, 수를 나열한 대상을 공간 안의 점 혹은 화살표로 읽으라고 권한다. 다시 말해, 선형대수를 숫자 계산의 기술로만 보지 말고, 공간적 직관을 활용해 이해하자는 것이 이 책의 큰 주제다.

이 관점은 생각보다 중요하다. 숫자만 바라보면 기호가 너무 건조해지고, 계산 규칙은 외워야 할 것처럼 느껴진다. 반면 그것을 공간으로 읽기 시작하는 순간, 벡터는 단지 숫자 묶음이 아니라 위치가 되고 방향이 되며, 행렬은 숫자 표가 아니라 공간을 바꾸는 작용이 된다. 그리고 행렬식은 더 이상 귀찮은 전개 공식이 아니라, 그 작용이 공간의 넓이나 부피를 얼마나 바꾸는지를 알려주는 양으로 보이기 시작한다.

책의 전체 관점을 아주 거칠게 요약하면 다음과 같다.

문자 배열(표면상)의미
벡터숫자를 일렬로 늘어놓은 것화살표, 또는 공간 안의 점
행렬숫자를 직사각형으로 늘어놓은 것공간에서 공간으로의 선형 사상
행렬식계산식처럼 보이는 값그 사상에 따른 넓이·부피 확대율

이 표를 보고 나면, 책이 왜 처음부터 기술적인 사칙연산을 배우게 하는지도 이해할 수 있다. 결국 선형대수는 공간을 다루는 언어이지만, 그 언어도 언어인 이상 기본 문법과 연산 규칙부터 익혀야 하기 때문이다. 벡터를 어떻게 더하는지, 수를 어떻게 곱하는지, 그것이 공간적으로 어떤 뜻을 갖는지를 먼저 익혀야 이후의 기저, 차원, 선형변환, 고유값 같은 개념도 자연스럽게 따라올 수 있다.


여러 수치를 한 덩어리로 다루고 싶다는 요구에서 출발한다

조금만 생각해 보면, 어떤 분야에서든 “몇 개의 수치를 한곳에 모아 한 덩어리로 다루고 싶다”는 요구는 아주 자연스럽다.

예를 들어 센서 열 개를 탑재한 로봇을 생각해 보자. 이 로봇은 매 순간 열 개의 관측값을 얻는다. 온도, 압력, 거리, 기울기, 속도, 전류량 같은 다양한 값들이 동시에 들어올 수도 있다. 이때 우리는 매번 “첫 번째 센서는 얼마, 두 번째 센서는 얼마, 세 번째 센서는 얼마...”라고 따로따로 적기보다는, 그것들을 하나의 데이터 묶음으로 보고 싶어진다. 그래야 지금 로봇이 어떤 상태에 있는지를 한 번에 표현할 수 있기 때문이다.

이처럼 여러 수를 순서 있게 모아 놓은 것을 선형대수에서는 벡터라고 부른다.

예를 들어 다음은 2차원 벡터다.

[12]\begin{bmatrix} 1 \\ 2 \end{bmatrix}

다음은 3차원 벡터다.

[314]\begin{bmatrix} 3 \\ -1 \\ 4 \end{bmatrix}

다음은 5차원 벡터다.

[20731]\begin{bmatrix} 2 \\ 0 \\ 7 \\ -3 \\ 1 \end{bmatrix}

이처럼 벡터를 구성하는 각 숫자를 성분이라고 부른다. 그래서 성분의 개수를 강조하고 싶을 때는 2차원 벡터, 3차원 벡터, 5차원 벡터라고 말한다. 차원이라는 말은 여기서 우선 아주 단순하게, “성분이 몇 개 있는가” 정도로 받아들여도 된다. 물론 뒤로 가면 차원은 훨씬 더 본질적인 의미를 갖게 되지만, 처음에는 이렇게 시작해도 충분하다.

그리고 선형대수에서는 특별한 말이 없으면 벡터를 보통 이렇게 세로로 세워 쓴다. 이런 형태를 종벡터라고 한다.

[x1x2xn]\begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}

반대로 가로로 늘어놓은 형태는 횡벡터라고 부른다.

[x1x2xn]\begin{bmatrix} x_1 & x_2 & \cdots & x_n \end{bmatrix}

처음 배우는 입장에서는 “세로로 쓰든 가로로 쓰든 그냥 보기 편한 대로 쓰면 되는 것 아닌가?” 싶을 수 있다. 하지만 선형대수에서는 종벡터를 기본으로 삼는 데 나름의 이유가 있다.

🤔왜 벡터는 기본적으로 종벡터로 다룰까?

선형대수에서는 벡터에 행렬이 작용하는 장면이 아주 자주 등장한다. 그리고 이때 가장 자연스럽고 일관된 표기가 바로 종벡터다.

우리는 일반적으로 변수 xx에 함수 ff를 적용하는 일을 f(x)f(x)라고 쓴다. 여기에는 “왼쪽에 있는 것이 작용 주체이고, 오른쪽에 있는 것이 입력”이라는 어순이 들어 있다. 선형대수에서도 같은 감각을 유지하고 싶다.

행렬 AA가 하나의 선형함수를 나타낸다고 생각해보자. 그러면 벡터 xx에 이 함수를 적용하는 일은 자연스럽게 AxAx라고 쓰고 싶어진다. 즉, “행렬 AA가 벡터 xx에 작용한다”는 표현이다.

이 표기를 일관되게 쓰기 위해서는 벡터가 종벡터여야 한다. 그래야 행렬과 벡터의 곱이 왼쪽에서 오른쪽으로 자연스럽게 이어진다.

A[x1x2xn]A \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}

이 형태는 “함수 적용”이라는 감각과 무척 잘 맞는다. 반면 횡벡터를 기본으로 잡으면, 같은 내용을 쓰기 위해 표기법이 더 어색해지거나 전치 같은 개념을 자주 끌고 와야 한다.

즉, 종벡터를 선호하는 이유는 단순한 취향 문제가 아니라, 행렬을 함수처럼 읽고 쓰기 가장 좋은 표기법이기 때문이다. 프로그래머 관점에서 보면, 이것은 마치 함수 호출 문법을 통일하는 것과 비슷하다. 표기 규칙이 한 번 정리되면, 이후의 개념들이 훨씬 매끄럽게 이어진다.


벡터를 정의했다면, 이제 그 위의 연산도 정의해야 한다

어떤 데이터 구조를 정의했다면, 그다음에는 자연스럽게 “그 구조에 어떤 연산이 가능한가”를 정해야 한다. 프로그래밍에서도 객체를 만들면 그 객체에 어떤 메서드가 허용되는지 생각하게 되듯이, 수학에서도 벡터라는 대상을 정의했으면 그 위에서 무엇을 할 수 있는지 정의해야 한다.

벡터에서 가장 기본이 되는 연산은 두 가지다.

하나는 덧셈이고, 다른 하나는 스칼라배다. 여기서 스칼라란 그냥 보통의 수를 뜻한다고 생각하면 된다.

벡터의 덧셈

같은 차원의 벡터끼리는 성분끼리 더해서 새로운 벡터를 만든다.

예를 들어 2차원 벡터의 덧셈은 다음과 같다.

[12]+[34]=[46]\begin{bmatrix} 1 \\ 2 \end{bmatrix} + \begin{bmatrix} 3 \\ 4 \end{bmatrix} = \begin{bmatrix} 4 \\ 6 \end{bmatrix}

3차원에서도 마찬가지다.

[215]+[432]=[623]\begin{bmatrix} 2 \\ -1 \\ 5 \end{bmatrix} + \begin{bmatrix} 4 \\ 3 \\ -2 \end{bmatrix} = \begin{bmatrix} 6 \\ 2 \\ 3 \end{bmatrix}

이 규칙은 너무 당연해 보여서 오히려 왜 굳이 정의하나 싶을 수 있다. 하지만 사실 여기에는 중요한 의미가 숨어 있다. 벡터를 단순한 숫자 묶음이 아니라 공간의 점이나 화살표로 해석하면, 벡터의 덧셈은 이동을 합성하는 연산처럼 읽힌다. 한 방향으로 조금 가고, 거기서 다시 다른 방향으로 조금 가는 일을 하나의 결과 벡터로 합쳐 주는 것이다.

다만 이 덧셈은 같은 차원의 벡터끼리만 가능하다. 2차원 벡터와 3차원 벡터는 애초에 같은 공간의 대상이 아니므로 더할 수 없다. 이것은 마치 서로 다른 타입의 데이터를 억지로 더하려고 하면 말이 안 되는 것과 비슷하다.

벡터의 스칼라배

벡터에 임의의 수 cc를 곱하는 연산도 정의한다. 이것을 스칼라배라고 한다.

예를 들어

2[13][26]2 \begin{bmatrix} 1 \\ 3 \end{bmatrix} \begin{bmatrix} 2 \\ 6 \end{bmatrix}

또는

1[241][241]-1 \begin{bmatrix} 2 \\ -4 \\ 1 \end{bmatrix} \begin{bmatrix} -2 \\ 4 \\ -1 \end{bmatrix}

처럼 계산한다.

분수나 실수도 마찬가지다.

12[46][23]\frac{1}{2} \begin{bmatrix} 4 \\ 6 \end{bmatrix} \begin{bmatrix} 2 \\ 3 \end{bmatrix}

스칼라배는 공간적으로 보면 벡터를 늘이거나 줄이는 연산이다. 양수를 곱하면 같은 방향으로 길이만 조절되고, 음수를 곱하면 방향이 뒤집히면서 크기가 조절된다. 아직 길이나 각도 같은 개념을 엄밀히 도입하지 않았더라도, 직관적으로는 충분히 이런 그림을 떠올릴 수 있다.

참고로 횡벡터의 덧셈과 스칼라배도 원리는 완전히 같다. 성분끼리 더하고, 성분마다 같은 수를 곱하면 된다. 다만 선형대수 전체의 전개에서는 종벡터를 기본으로 보는 편이 훨씬 자연스럽기 때문에, 대부분의 서술은 종벡터 기준으로 진행된다.


영벡터와 기본 성질들

벡터의 연산을 정의하면, 곧바로 몇 가지 중요한 성질이 따라온다. 이 성질들은 나중에 선형공간을 정의하는 핵심 공리들과 연결된다.

가장 먼저 등장하는 것은 영벡터다. 영벡터는 모든 성분이 0인 벡터다.

예를 들어 2차원에서는

[00]\begin{bmatrix} 0 \\ 0 \end{bmatrix}

이고, 3차원에서는

[000]\begin{bmatrix} 0 \\ 0 \\ 0 \end{bmatrix}

이다.

영벡터는 벡터 덧셈에서 특별한 역할을 한다. 아무 벡터에 영벡터를 더해도 원래 벡터가 그대로 유지된다.

[25]+[00][25]\begin{bmatrix} 2 \\ 5 \end{bmatrix} + \begin{bmatrix} 0 \\ 0 \end{bmatrix} \begin{bmatrix} 2 \\ 5 \end{bmatrix}

즉, 영벡터는 덧셈에 대한 항등원이다.

이제 스칼라배와 관련된 기본 성질도 볼 수 있다. 예를 들어 수 cc, cc'와 벡터 xx에 대해 다음이 성립한다.

(cc)x=c(cx)(cc')x = c(c'x)

이것은 “먼저 cc'배한 다음 다시 cc배하는 것”과 “처음부터 cccc'배하는 것”이 같다는 뜻이다.

예를 들어

c=2,c=3,x=[12]c = 2,\quad c' = 3,\quad x = \begin{bmatrix} 1 \\ -2 \end{bmatrix}

라고 하면,

먼저 왼쪽을 계산하면

(cc)x6[12][612](cc')x 6 \begin{bmatrix} 1 \\ -2 \end{bmatrix} \begin{bmatrix} 6 \\ -12 \end{bmatrix}

이고,

오른쪽을 계산하면

c(cx)2(3[12])2[36][612]c(c'x) 2 \left( 3 \begin{bmatrix} 1 \\ -2 \end{bmatrix} \right) 2 \begin{bmatrix} 3 \\ -6 \end{bmatrix} \begin{bmatrix} 6 \\ -12 \end{bmatrix}

가 되어 둘이 같다.

또한

1x=x1x = x

도 성립한다. 1을 곱한다고 해서 아무 변화가 없기 때문이다. 예를 들어

1[412][412]1 \begin{bmatrix} 4 \\ -1 \\ 2 \end{bmatrix} \begin{bmatrix} 4 \\ -1 \\ 2 \end{bmatrix}

이다.

이런 성질들은 너무 자명해 보여도, 사실상 “벡터라는 대상이 수와 얼마나 잘 어울려서 움직이는가”를 보장해 주는 규칙들이다. 그리고 이런 규칙들이 차곡차곡 쌓여 선형공간이라는 개념을 형성한다.


벡터를 공간으로 보면 무슨 일이 달라질까

이제부터가 이 책의 가장 재미있는 부분이다. 벡터를 단순한 숫자 묶음이 아니라 공간의 점 혹은 화살표로 읽는 순간, 앞에서 정의한 연산들에 직관이 붙기 시작한다.

2차원 벡터는 모눈종이 위에 점으로 찍을 수 있다. 예를 들어

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

는 평면 위에서 오른쪽으로 2, 위로 1 간 위치에 해당하는 점으로 볼 수 있다. 이처럼 벡터를 위치에 대응시키는 해석을 강조할 때는 위치 벡터라고 부르기도 한다.

그런데 덧셈과 스칼라배를 도형으로 해석할 때는 점보다는 화살표 해석이 더 잘 어울린다. 왜냐하면 화살표는 방향과 이동량이라는 감각을 자연스럽게 담고 있기 때문이다.

예를 들어 벡터의 덧셈은 “한 화살표를 따라 이동한 뒤, 거기서 다시 다른 화살표만큼 이동한다”는 그림으로 이해할 수 있다. 그리고 스칼라배는 “화살표의 방향을 유지한 채 길이를 늘이거나 줄인다”는 그림으로 읽을 수 있다. 음수를 곱하면 방향이 뒤집힌다는 감각도 자연스럽다.

흥미로운 점은, 이렇게 화살표로 해석하면 사실 눈금이 지워져도 연산 자체는 여전히 가능하다는 것이다. 본래 우주에는 “오른쪽”이나 “위”가 절대적인 방향으로 정해져 있는 것이 아니다. 우리가 좌표축을 그어 놓고 기준을 정했기 때문에 그렇게 말할 수 있을 뿐이다. 좌표를 잠시 잊고, 단지 화살표와 그 합성만을 생각해도 벡터의 덧셈과 스칼라배는 여전히 의미를 가진다.

바로 여기서 선형대수의 추상화가 시작된다.


덧셈과 스칼라배가 정의된 세계, 선형공간

이처럼 덧셈과 스칼라배가 정의된 세계를 선형공간이라고 부른다. 벡터 공간이라고 부르는 사람도 많고, 실제로 두 표현은 거의 같은 뜻으로 쓰인다.

중요한 것은, 이 세계가 우리가 사는 현실 공간을 있는 그대로 복제한 것이 아니라는 점이다. 이것은 현실 공간의 특정한 측면만 떼어내어 만든 기능 축소판에 가깝다. 현실에는 길이도 있고 각도도 있고 회전도 있고 거리도 있다. 하지만 선형공간은 처음부터 그런 모든 기능을 다 포함하지 않는다. 우선은 덧셈과 스칼라배라는 가장 기본적인 작용만 남겨 놓는다.

그래서 이 세계에서는 영벡터만이 특별하다. 영벡터는 “아무 데도 가지 않는 화살표” 혹은 “원점”에 해당하므로 기준점 역할을 한다. 하지만 영벡터를 제외한 나머지 벡터들은 본질적으로 모두 대등하다. 어느 벡터가 더 고귀하거나, 어느 방향이 더 특별한 것은 아니다. 좌표계를 어떻게 잡느냐에 따라 표현이 달라질 뿐이지, 벡터 자체는 그저 이 공간 안의 원소일 뿐이다.

또한 이 세계에서는 본래 길이각도가 정의되어 있지 않다는 것도 중요하다. 우리는 평면 그림을 그리다 보니 자꾸 “이 벡터가 더 길다”, “두 벡터가 수직이다”, “이건 회전이다” 같은 말을 자연스럽게 떠올리게 된다. 하지만 엄밀하게 말해, 그것들은 선형공간에 자동으로 주어지는 성질이 아니다. 길이와 각도를 말하려면 내적 같은 추가 구조가 더 필요하다.

즉, 선형공간만으로는 다음 같은 일은 아직 일반적으로 정의되어 있지 않다.

  • 서로 다른 방향의 벡터를 크기 비교하기
  • 각도를 재기
  • 길이를 보존한 채 방향만 바꾸는 회전 말하기

이런 기능은 나중에 더 풍부한 구조를 얹어야 등장한다. 처음의 선형공간은 철저하게 “덧셈과 스칼라배만 가능한 세계”다. 그런 의미에서 정말 선형적이다. 뭐든지 곧게 더해지고, 곧게 늘어나고, 곧게 줄어드는 세계인 셈이다.


기준을 정하고 번지를 매기기 — 기저의 필요성

그런데 여기서 한 가지 문제가 생긴다. 벡터를 공간의 화살표로 이해할 수는 있어도, 그것을 서로에게 정확히 전달하려면 결국 어떤 표현 방식이 필요하다. 말하자면 이 공간의 점들에 “번지”를 붙여야 한다.

현실에서도 위치를 설명할 때는 기준이 필요하다. “저쪽으로 조금”이라고 말하는 것만으로는 정확한 전달이 어렵다. 대신 “정문에서 동쪽으로 20미터, 북쪽으로 10미터”처럼 기준 방향과 눈금을 정하면 위치를 훨씬 명확하게 전달할 수 있다.

선형대수에서도 마찬가지다. 공간의 벡터를 수치로 표현하려면, 먼저 이 공간에서 기준이 되는 방향들을 정해야 한다. 이 기준 방향들의 묶음을 기저라고 부른다.

예를 들어 2차원 평면에서는 보통 다음 두 벡터를 기준으로 잡는다.

e1=[10],e2=[01]\mathbf{e}_1 = \begin{bmatrix} 1 \\ 0 \end{bmatrix}, \qquad \mathbf{e}_2 = \begin{bmatrix} 0 \\ 1 \end{bmatrix}

그러면 평면의 어떤 벡터든 이 두 벡터의 조합으로 나타낼 수 있다.

예를 들어

[32]3e1+2e2\begin{bmatrix} 3 \\ 2 \end{bmatrix} 3\mathbf{e}_1 + 2\mathbf{e}_2

이다.

이 표현은 단순한 계산식이 아니다. 이것은 “오른쪽 방향 기준벡터를 3번, 위쪽 방향 기준벡터를 2번 사용하면 이 벡터가 된다”는 뜻이다. 즉, 좌표란 결국 기저에 대해 “각 기준 방향을 얼마나 썼는가”를 적은 기록이다.

그래서 기저를 정한다는 것은 공간에 번지를 매길 체계를 정하는 것과 같다. 기저가 있어야 벡터를 숫자로 표현할 수 있고, 숫자로 표현해야 계산을 할 수 있다. 다시 말해, 기저는 공간과 수치를 연결해 주는 다리다.


기저가 되기 위한 조건

그렇다면 아무 벡터 몇 개나 골라 놓으면 기저가 될까. 그렇지는 않다. 기저가 되기 위해서는 두 가지 조건이 필요하다.

첫째, 그 벡터들로 공간의 모든 벡터를 만들어낼 수 있어야 한다. 즉, 공간 전체를 생성해야 한다.

둘째, 그 벡터들 사이에 쓸데없는 중복이 없어야 한다. 즉, 서로가 서로를 대신할 수 없어야 한다. 이것이 선형 독립이라는 조건이다.

2차원 평면을 예로 들면, 서로 다른 방향을 가리키는 두 벡터가 있으면 보통 평면 전체를 생성할 수 있다. 예를 들어

[10],[01]\begin{bmatrix} 1 \\ 0 \end{bmatrix}, \qquad \begin{bmatrix} 0 \\ 1 \end{bmatrix}

은 평면의 기저가 된다.

하지만

[10],[20]\begin{bmatrix} 1 \\ 0 \end{bmatrix}, \qquad \begin{bmatrix} 2 \\ 0 \end{bmatrix}

은 기저가 될 수 없다. 둘 다 같은 직선 위에 놓여 있어서 사실상 한 방향만 주고 있기 때문이다. 이런 경우에는 평면 전체를 만들 수 없고, 오직 x축 방향으로만 움직일 수 있다.

즉, 기저란 “공간 전체를 표현하기에 충분하면서도, 그 이상으로 중복되지 않는 최소한의 기준 방향들”이라고 이해할 수 있다.


차원이란 무엇인가

이제 차원의 의미도 조금 더 분명해진다. 처음에는 차원을 단순히 “성분 개수”처럼 받아들였지만, 기저를 배우고 나면 차원은 훨씬 더 본질적인 뜻을 갖는다.

차원은 그 공간의 기저를 이루는 벡터의 개수다.

2차원 평면은 두 개의 독립적인 기준 방향이 있으면 전체를 설명할 수 있으므로 2차원이다. 3차원 공간은 세 개의 독립적인 기준 방향이 있으면 전체를 설명할 수 있으므로 3차원이다.

이 정의가 좋은 이유는, 좌표 표현이 바뀌어도 차원은 변하지 않는다는 데 있다. 기준을 어떤 식으로 잡든, 평면을 설명하는 데 필요한 독립적인 방향 수는 결국 2개고, 우리가 사는 공간을 설명하는 데 필요한 독립적인 방향 수는 결국 3개다.

즉 차원은 단순히 숫자 몇 개를 썼는가의 문제가 아니라, 그 공간이 갖는 자유도의 수, 또는 독립적인 방향의 수를 뜻한다.

이렇게 생각하면 5차원, 10차원, 100차원도 조금 덜 막연해진다. 그것은 우리가 눈으로 직접 그릴 수 없는 공간일 뿐, 독립적인 방향이 각각 5개, 10개, 100개 필요한 공간이라는 뜻이다. 그리고 데이터 분석이나 머신러닝에서는 바로 이런 고차원 공간이 일상적으로 등장한다. 특성이 100개인 데이터라면, 각 샘플은 100차원 공간의 한 점으로 볼 수 있기 때문이다.


숫자 계산을 배우는 것이 아니라, 공간을 읽는 법을 배우는 것

여기까지 따라오면 이 책이 왜 처음부터 벡터의 덧셈과 스칼라배 같은 가장 기초적인 내용을 다루는지 납득이 간다. 겉으로 보기에는 단순한 사칙연산을 배우는 것처럼 보이지만, 실제로는 그 연산이 공간 안에서 무슨 뜻을 갖는가를 배우고 있는 것이다.

벡터를 더하는 것은 단지 성분끼리 더하는 계산이 아니다. 그것은 이동을 합치는 일이다. 벡터에 수를 곱하는 것은 단지 모든 성분에 같은 수를 곱하는 계산이 아니다. 그것은 방향을 유지한 채 크기를 조절하는 일이다. 기저를 정하는 것은 숫자 놀이를 위한 편의가 아니다. 그것은 공간에 좌표라는 번지 체계를 부여하는 일이다. 차원을 정의하는 것은 단순한 분류가 아니다. 그것은 그 공간이 몇 개의 독립적인 방향으로 이루어져 있는지를 밝히는 일이다.

이렇게 보면 선형대수는 결코 무의미한 형식 조작이 아니다. 오히려 세계를 구조적으로 표현하기 위한 최소한의 언어에 가깝다. 그리고 『프로그래머를 위한 선형대수』는 바로 그 점을 처음부터 끝까지 일관되게 밀고 나간다. 데이터를 그저 숫자 표로 두지 말고, 공간 속 점으로 읽어 보라는 것이다. 그렇게 해야 계산 규칙도 살아 움직이고, 기호도 직관을 얻게 된다.

좋다. 이번 글은 앞선 글에서 다룬 벡터라는 대상 위에, 그 대상들 사이의 관계를 올려놓는 글이라고 보면 된다. 앞선 글에서 “여러 수치를 한 덩어리로 다루는 법”을 배웠다면, 이제는 그 덩어리가 어떻게 다른 덩어리로 바뀌는가를 다루게 된다. 그리고 바로 그 지점에서 행렬이 등장한다.

아래 글은 앞선 글과 자연스럽게 이어지는 흐름으로, 같은 톤과 같은 문제의식 위에서 작성해보았다.


행렬과 사상 — 대상 사이의 관계를 표현하는 언어

앞선 글에서는 벡터를 다루었다. 벡터는 여러 수치를 한 덩어리로 묶어 다루기 위한 기본 단위였고, 동시에 공간 안의 점이나 화살표로 읽을 수 있는 대상이었다. 숫자의 나열을 단순한 표가 아니라 공간 안의 위치와 방향으로 바라보는 순간, 선형대수는 그저 계산 규칙의 모음이 아니라 공간을 읽는 언어처럼 보이기 시작했다.

그렇다면 그다음 질문은 자연스럽다. 대상을 알았으니, 이제는 그 대상들 사이의 관계를 알고 싶어진다.

하나의 벡터가 다른 벡터로 바뀐다는 것은 무슨 뜻일까. 어떤 입력 데이터를 받아 다른 형태의 출력 데이터로 변환한다는 것은 어떤 구조를 가질까. 2차원 공간의 점을 3차원 공간의 점으로 보내거나, 평면의 모든 점을 회전시키거나, 특정 방향으로 늘이거나 찌그러뜨리는 일은 어떻게 표현할 수 있을까.

바로 이 관계를 표현하기 위해 행렬이 등장한다.

벡터가 “대상”이었다면, 행렬은 그 대상을 다른 대상으로 보내는 작용, 혹은 변환 규칙을 표현하는 언어라고 볼 수 있다. 그래서 선형대수에서 벡터 다음에 행렬이 등장하는 것은 아주 자연스럽다. 대상만 알아서는 세계를 다 이해할 수 없다. 결국 중요한 것은 그 대상이 어떻게 움직이고, 바뀌고, 연결되는가이기 때문이다.


행렬의 가장 표면적인 정의 — 수를 직사각형으로 늘어놓은 것

행렬을 가장 표면적으로 정의하면, 수를 직사각형 모양으로 배열한 것이다.

예를 들어 다음은 2행 3열 행렬이다.

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

이 행렬은 숫자 6개를 두 줄 세 칸의 직사각형 모양으로 배치한 것이다. 여기서 가로 방향을 , 세로 방향을 이라고 부른다.

즉 위 행렬은

  • 행의 수가 2개
  • 열의 수가 3개

이므로 2행 3열 행렬이다.

반대로 이런 행렬도 있을 수 있다.

B=[1001]B = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}

이 행렬은 2행 2열이다. 이렇게 행의 수와 열의 수가 같은 행렬정방행렬이라고 부른다. 2행 2열이면 2차 정방행렬, 3행 3열이면 3차 정방행렬이라고 부른다.

행렬을 처음 배우면 이 단계에서는 “그래서 결국 숫자 표 아닌가?” 싶어진다. 실제로 겉모습만 보면 숫자 표가 맞다. 그러나 선형대수에서는 이 숫자 표를 단지 데이터 저장용 표처럼 보지 않는다. 이 직사각형 배열에는 나중에 벡터를 다른 벡터로 보내는 규칙이라는 의미가 붙는다. 그 의미를 이해하게 되면, 행렬은 더 이상 정적인 표가 아니라 동적인 작용으로 보이기 시작한다.


행과 열, 그리고 성분이라는 말

행렬의 각 숫자는 제각기 위치를 갖는다. 그래서 행렬의 숫자를 가리킬 때는 “몇 번째 행, 몇 번째 열에 있는 값인가”로 말한다.

예를 들어

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

라는 행렬에서,

  • 첫 번째 행, 두 번째 열의 값은 1-1
  • 두 번째 행, 세 번째 열의 값은 55

이다.

이때 행렬 AAiijj열에 있는 값을 보통 AijA_{ij}라고 쓴다. 즉 위 행렬에서는

A12=1,A23=5A_{12} = -1, \qquad A_{23} = 5

이다.

이 표기법은 행렬이 커질수록 매우 중요해진다. 매번 행렬 전체를 적어두고 “두 번째 줄 세 번째 숫자”라고 말하기보다, 그냥 A23A_{23}라고 쓰는 편이 훨씬 간단하고 정확하기 때문이다.

그래서 행렬 전체를 아예

A=(Aij)A = (A_{ij})

처럼 줄여 쓰는 경우도 많다. 물론 이 표기만으로는 행과 열이 몇 개인지 따로 맥락이 있어야 알 수 있지만, 일반적인 설명이나 증명에서는 매우 자주 등장한다. 말하자면 이것은 “행렬의 각 칸에 들어 있는 일반적인 값을 AijA_{ij}라고 부르자”는 약속이다.

처음 보는 입장에서는 iijj가 헷갈리기 쉽다. 보통은 앞의 첨자 ii가 행, 뒤의 첨자 jj가 열이다. 즉,

AijA_{ij}

는 “iijj열”이다. 이 순서를 익혀두는 것이 중요하다. 왜냐하면 나중에 행렬 곱이나 전치행렬, 성분 계산을 할 때 이 순서가 계속 등장하기 때문이다.


행렬의 덧셈과 스칼라배

벡터를 정의했으면 덧셈과 스칼라배를 정의했던 것처럼, 행렬도 마찬가지다. 행렬 역시 일종의 수학적 대상이므로, 그 위에서 어떤 연산이 허용되는지를 정해야 한다.

행렬의 덧셈은 아주 단순하다. 같은 위치의 성분끼리 더한다.

예를 들어

A=[1234],B=[5678]A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \qquad B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix}

이면,

A+B=[1+52+63+74+8][681012]A+B= \begin{bmatrix} 1+5 & 2+6 \\ 3+7 & 4+8 \end{bmatrix} \begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix}

가 된다.

여기서 중요한 점은 같은 크기의 행렬끼리만 더할 수 있다는 것이다. 2행 2열 행렬과 2행 3열 행렬은 서로 다른 구조를 가지므로 더할 수 없다. 이것은 벡터 덧셈에서 차원이 같아야 했던 것과 같은 맥락이다. 형태가 맞아야 더할 수 있다.

스칼라배도 역시 성분마다 같은 수를 곱하면 된다. 예를 들어

2[1304][2608]2 \begin{bmatrix} 1 & -3 \\ 0 & 4 \end{bmatrix} \begin{bmatrix} 2 & -6 \\ 0 & 8 \end{bmatrix}

이다.

표면적으로는 단순한 연산처럼 보인다. 하지만 이 연산도 나중에 행렬을 “작용”으로 읽기 시작하면 의미가 생긴다. 행렬의 덧셈은 두 관계를 겹쳐 놓는 것처럼 읽힐 수 있고, 스칼라배는 관계 전체의 강도를 일정 비율로 키우거나 줄이는 것으로 볼 수 있다. 아직은 기술적인 연산처럼 보이더라도, 뒤로 갈수록 이 연산들이 사상과 연결되며 의미를 얻게 된다.


행렬의 곱은 왜 조금 다르게 생겼을까

행렬의 덧셈과 스칼라배는 비교적 직관적이다. 그런데 처음 행렬의 곱을 배우면 많은 사람이 여기서 한 번 멈칫한다.

왜냐하면 행렬 곱은 성분끼리 그냥 곱하는 방식이 아니기 때문이다.

예를 들어

A=[1234],B=[5678]A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \qquad B = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix}

라고 할 때, 행렬 곱 ABAB는 다음처럼 계산한다.

AB=[15+2716+2835+4736+48][19224350]AB = \begin{bmatrix} 1\cdot5 + 2\cdot7 & 1\cdot6 + 2\cdot8 \\ 3\cdot5 + 4\cdot7 & 3\cdot6 + 4\cdot8 \end{bmatrix} \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix}

겉으로 보기에는 꽤 인위적인 규칙처럼 느껴진다. 왜 이런 식으로 정했을까. 왜 같은 위치끼리 곱하지 않을까.

이 질문에 대한 가장 중요한 답은, 행렬의 곱이 단순한 숫자놀이가 아니라 관계의 합성, 즉 사상의 연속 적용을 표현하기 위해 이렇게 정의되었다는 데 있다. 다시 말해, 행렬 곱의 규칙은 우연히 이렇게 정해진 것이 아니라, 행렬을 “작용”으로 읽을 때 가장 자연스럽게 맞아떨어지도록 만들어진 규칙이다.

이 점은 뒤에서 다시 자세히 보겠지만, 미리 감을 잡아두면 좋다. 행렬 곱은 “표 두 개를 계산하는 방법”이 아니라, “변환 하나를 하고 나서 다시 다른 변환을 하는 것”을 하나의 식으로 묶는 방법이다.


여러 가지 관계를 행렬로 나타낸다는 것

행렬이 왜 중요한가를 이해하려면, 먼저 현실에서 “순수한 관계”를 수식으로 표현하는 상황을 떠올려보면 좋다.

여기서 말하는 순수한 관계란, 상호작용이 복잡하게 꼬여 있지 않고, 각 요인이 독립적으로 기여해서 최종 결과가 단순한 합으로 정해지는 경우를 말한다. 즉, 상승 효과나 복잡한 비선형 효과가 없는 가장 기본적인 관계다.

이런 관계는 생각보다 자주 등장한다.

예를 들어 어떤 가게에서 두 상품을 판다고 하자. 상품 A는 한 개 팔릴 때마다 재료 X를 2만큼, 재료 Y를 1만큼 사용하고, 상품 B는 한 개 팔릴 때마다 재료 X를 1만큼, 재료 Y를 3만큼 사용한다고 해보자.

그러면 상품 A를 aa개, 상품 B를 bb개 팔았을 때 총 사용량은

[2a+ba+3b]\begin{bmatrix} 2a + b \\ a + 3b \end{bmatrix}

로 나타낼 수 있다.

이 식은 다음 행렬과 벡터의 곱으로 쓸 수 있다.

[2113][ab][2a+ba+3b]\begin{bmatrix} 2 & 1 \\ 1 & 3 \end{bmatrix} \begin{bmatrix} a \\ b \end{bmatrix} \begin{bmatrix} 2a + b \\ a + 3b \end{bmatrix}

이 행렬은 “입력량 [a b]\begin{bmatrix} a \ b \end{bmatrix}를 받아 총 자원 사용량으로 바꾸는 규칙”을 나타낸다.

이런 식의 표현은 정말 자주 쓰인다. 어떤 요소가 여러 결과에 각각 얼마만큼 영향을 주는지를 정리해 두고, 입력 벡터를 넣으면 출력 벡터가 나오게 하는 방식이다.

머리와 다리의 개수 문제

조금 더 익숙한 예도 있다. 닭과 거북이가 있다고 하자. 닭의 수를 xx, 거북이의 수를 yy라고 하면,

  • 머리 수는 x+yx+y
  • 다리 수는 2x+4y2x+4y

가 된다.

이 역시 행렬로 쓰면

[1124][xy][x+y2x+4y]\begin{bmatrix} 1 & 1 \\ 2 & 4 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} x+y \\ 2x+4y \end{bmatrix}

이다.

이 표현의 좋은 점은, 숫자를 그냥 나열한 것이 아니라 “닭과 거북이의 수라는 입력이 머리 수와 다리 수라는 출력으로 바뀌는 관계”를 구조적으로 드러낸다는 데 있다.

성적 계산의 예

학생이 세 과목 점수를 가지고 있고, 총점과 가중평균을 계산한다고 해보자. 점수 벡터를

[mes]\begin{bmatrix} m \\ e \\ s \end{bmatrix}

라고 하면, 총점과 어떤 가중합은 다음 같은 행렬로 표현할 수 있다.

[1110.50.30.2][mes][m+e+s0.5m+0.3e+0.2s]\begin{bmatrix} 1 & 1 & 1 \\ 0.5 & 0.3 & 0.2 \end{bmatrix} \begin{bmatrix} m \\ e \\ s \end{bmatrix} \begin{bmatrix} m+e+s \\ 0.5m+0.3e+0.2s \end{bmatrix}

이처럼 행렬은 “입력을 받아 출력으로 바꾸는 순수한 관계”를 적어두는 데 매우 적합하다. 각 출력은 입력 성분들의 선형 결합으로 이루어진다. 그리고 이런 선형 결합이 여러 개 모이면 그것이 바로 행렬이 된다.


행렬은 결국 사상이다

이제 본격적으로 중요한 말을 해야 한다. 행렬은 단지 숫자를 직사각형으로 적어 놓은 표가 아니라, 사상이다.

그런데 “사상”이라는 말은 처음 들으면 꽤 낯설다. 한자어라서 더 어렵게 느껴지기도 한다. 수학책에서 사상이라고 하면 괜히 대단한 개념처럼 보이지만, 아주 쉽게 말하면 사상은 그냥 어떤 입력을 어떤 출력으로 보내는 규칙이다.

영어로는 보통 map 또는 mapping이라고 한다. 즉, “어디를 어디로 보낸다”는 뜻이다.

예를 들어 함수 f(x)=2x+1f(x)=2x+1도 하나의 사상이다. 입력 xx를 받아 출력 2x+12x+1로 보내기 때문이다. 프로그래밍으로 생각하면 더 익숙하다. 함수 하나를 정의해 놓고 값을 넣으면 결과가 나온다. 그것이 바로 사상이다.

예를 들어 자바스크립트로 쓰면

JavaScript

이 함수는 숫자를 숫자로 보내는 사상이다.

그렇다면 행렬은 무엇을 어디로 보내는가. 행렬은 벡터를 다른 벡터로 보낸다.

예를 들어

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

라는 행렬은 2차원 벡터

[xy]\begin{bmatrix} x \\ y \end{bmatrix}

[2xy]\begin{bmatrix} 2x \\ y \end{bmatrix}

로 보낸다.

즉,

A[xy][2xy]A \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} 2x \\ y \end{bmatrix}

이다.

이것을 공간적으로 보면, 평면의 모든 점을 x축 방향으로 2배 늘리는 변환이다. 입력 벡터가 목적지 벡터로 이동하는 규칙, 바로 그것이 사상이다.

그래서 “행렬은 사상이다”라는 말은 결국 “행렬은 벡터를 벡터로 보내는 함수다”라는 뜻이다. 프로그래머 관점에서 보면, 행렬은 벡터 타입을 입력받아 다른 벡터 타입을 출력하는 함수 객체처럼 생각할 수 있다. 다만 그 함수가 아주 특별해서, 덧셈과 스칼라배를 보존하는 선형성을 가진다.


목적지를 나타낸다는 말의 의미

사상을 설명할 때 “목적지”라는 표현을 쓰는 경우가 있다. 이 말도 처음에는 다소 추상적으로 느껴질 수 있다. 하지만 뜻은 어렵지 않다.

어떤 사상은 “어떤 집합의 원소를 다른 집합의 원소로 보낸다.” 여기서 보내진 결과가 도착하는 쪽의 세계가 곧 목적지다.

예를 들어

  • 2차원 벡터를 2차원 벡터로 보내는 행렬도 있고
  • 3차원 벡터를 2차원 벡터로 보내는 행렬도 있고
  • 2차원 벡터를 3차원 벡터로 보내는 행렬도 있다

즉, 행렬은 출발지와 목적지를 가진다.

예를 들어

A=[120013]A = \begin{bmatrix} 1 & 2 & 0 \\ 0 & 1 & 3 \end{bmatrix}

는 2행 3열 행렬이다. 이 행렬은 3차원 벡터를 입력받아 2차원 벡터를 출력한다.

실제로

A[xyz][x+2yy+3z]A \begin{bmatrix} x \\ y \\ z \end{bmatrix} \begin{bmatrix} x+2y \\ y+3z \end{bmatrix}

이므로, 출발지는 R3\mathbb{R}^3이고 목적지는 R2\mathbb{R}^2다.

프로그래밍으로 치면 함수 시그니처 같은 것이다. 숫자 세 개를 묶은 입력을 받아 숫자 두 개를 묶은 출력으로 바꾸는 함수라고 생각할 수 있다. 즉, 행렬의 크기 자체가 이미 “입력 몇 개를 받아 출력 몇 개를 내놓는가”를 말해주고 있는 셈이다.


행렬의 곱은 사상의 합성이다

이제 행렬 곱의 진짜 의미가 나온다.

사상의 합성이란, 어떤 함수를 적용한 다음 그 결과에 다시 다른 함수를 적용하는 것이다. 프로그래밍에서는 함수 체이닝이나 합성 함수와 같은 감각으로 이해할 수 있다.

예를 들어 함수 gg가 있고, 그 다음에 함수 ff를 적용하면 결과는 f(g(x))f(g(x))가 된다. 즉, 먼저 gg로 보내고, 그다음에 ff로 보낸 것이다. 이것을 사상의 합성이라고 부른다.

행렬도 똑같다.

행렬 BB가 벡터 xx를 다른 벡터로 보내고, 그 결과에 다시 행렬 AA를 적용한다고 하자. 그러면 전체 과정은

A(Bx)A(Bx)

가 된다.

그런데 선형대수에서는 이 전체 과정을 하나의 행렬로 표현할 수 있다. 그 행렬이 바로 ABAB다. 즉,

A(Bx)=(AB)xA(Bx) = (AB)x

가 되도록 행렬 곱을 정의한다.

이 식이야말로 행렬 곱의 핵심이다. 행렬 곱은 계산 편의를 위해 임의로 만들어진 규칙이 아니라, 사상을 연달아 적용한 결과를 하나의 사상으로 묶기 위해 정의된 규칙이다.

이 점을 이해하면 왜 행렬 곱이 그렇게 생겼는지도 납득이 간다. 행렬의 곱은 “관계와 관계를 잇는 법”이다. 한 변환 뒤에 또 다른 변환이 올 때, 그것을 하나의 변환으로 압축해 표현하는 법이다.


예제로 보는 사상의 합성과 행렬 곱

예를 들어 먼저 x축 방향으로 2배 늘리는 변환이 있고,

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

그 다음에 좌표를 서로 바꾸는 변환이 있다고 하자.

A=[0110]A = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}

그러면 임의의 벡터 [x y]\begin{bmatrix} x \ y \end{bmatrix}에 대해,

먼저 BB를 적용하면

B[xy][2xy]B \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} 2x \\ y \end{bmatrix}

이고, 여기에 다시 AA를 적용하면

A[2xy][y2x]A \begin{bmatrix} 2x \\ y \end{bmatrix} \begin{bmatrix} y \\ 2x \end{bmatrix}

가 된다.

이 전체 과정을 한 번에 하는 행렬은 ABAB다.

실제로 계산하면

AB=[0110][2001][0120]AB = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 2 & 0 \end{bmatrix}

이고,

(AB)[xy][0120][xy][y2x](AB) \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 2 & 0 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} y \\ 2x \end{bmatrix}

가 되어 앞의 결과와 정확히 일치한다.

이것이 바로 행렬 곱 = 사상의 합성이라는 뜻이다.


행렬 연산의 기본 성질

행렬을 사상으로 이해하면 여러 성질도 자연스럽게 보인다.

덧셈의 교환법칙과 결합법칙

크기가 같은 행렬끼리는

A+B=B+AA+B = B+A

가 성립하고,

(A+B)+C=A+(B+C)(A+B)+C = A+(B+C)

도 성립한다.

이것은 성분별 덧셈이기 때문에 벡터의 경우와 거의 같은 이유로 성립한다.

곱셈의 결합법칙

행렬 곱에서는

(AB)C=A(BC)(AB)C = A(BC)

가 성립한다.

이것은 사상을 연달아 세 번 적용할 때, 앞의 둘을 먼저 묶든 뒤의 둘을 먼저 묶든 전체 결과는 같다는 뜻으로 이해할 수 있다. 즉, 함수 합성의 결합법칙과 같은 구조다.

곱셈의 교환법칙은 일반적으로 성립하지 않음

반면

AB=BAAB = BA

는 일반적으로 성립하지 않는다.

이것은 사상의 합성을 생각하면 오히려 당연하다. 먼저 늘린 뒤에 회전하는 것과, 먼저 회전한 뒤에 늘리는 것은 보통 같은 결과가 아니다. 즉, 관계의 순서가 중요하다.

아까의 예에서도 순서를 바꾸면 다른 결과가 나온다. 그래서 행렬 곱에서는 순서가 본질적이다.

분배법칙

또한

A(B+C)=AB+ACA(B+C)=AB+AC

(A+B)C=AC+BC(A+B)C=AC+BC

도 성립한다.

이것은 하나의 사상이 두 관계의 합에 작용할 때, 각각 따로 작용한 뒤 더한 것과 같다는 뜻이다. 선형성의 흔적이 여기서도 드러난다.


벡터도 사실 행렬의 일종이다

조금 시야를 넓혀 보면, 벡터도 사실 행렬의 특별한 경우로 볼 수 있다.

종벡터는 열이 1개인 행렬이다.

예를 들어

[123]\begin{bmatrix} 1 \\ 2 \\ 3 \end{bmatrix}

는 3행 1열 행렬이다.

반대로 횡벡터는 행이 1개인 행렬이다.

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

는 1행 3열 행렬이다.

즉, 행렬이라는 더 큰 틀 안에 벡터가 포함되어 있다고 볼 수 있다. 이 관점은 매우 편리하다. 벡터와 행렬을 완전히 다른 존재로 보기보다, 행렬의 특수한 형태로 보면 많은 계산 규칙을 하나의 언어로 통일할 수 있기 때문이다.

프로그래밍으로 치면, 벡터가 행렬이라는 일반 타입의 특수 케이스인 셈이다.


행렬의 거듭제곱은 사상의 반복이다

정방행렬 AA에 대해

A2=AA,A3=AAAA^2 = AA, \qquad A^3 = AAA

처럼 같은 행렬을 여러 번 곱할 수 있다. 이것은 단순한 기호놀이가 아니라, 같은 사상을 반복해서 적용하는 뜻이다.

예를 들어 어떤 변환 AA가 한 번 적용될 때마다 상태를 바꾼다고 하자. 그러면 A2A^2는 그 변환을 두 번 적용한 것이고, A3A^3는 세 번 적용한 것이다.

이것은 반복 상태 전이 같은 것을 다룰 때 특히 유용하다. 예를 들어 어떤 시스템의 현재 상태 벡터가 있고, 한 번의 시간 경과마다 같은 규칙으로 상태가 바뀐다면, 다음 상태는 AxAx, 두 단계 뒤 상태는 A2xA^2x, 세 단계 뒤 상태는 A3xA^3x가 된다.

즉, 행렬의 거듭제곱은 “같은 변화 규칙을 반복 적용한 결과”를 표현한다.


영행렬, 단위행렬, 대각행렬

행렬에도 특별한 역할을 하는 기본 행렬들이 있다.

영행렬

모든 성분이 0인 행렬을 영행렬이라고 한다.

예를 들어

O=[0000]O = \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix}

이다.

영행렬은 덧셈에서 항등원 역할을 한다. 즉,

A+O=AA + O = A

이다.

사상으로 보면, 모든 벡터를 영벡터로 보내는 변환이라고도 볼 수 있다.

단위행렬

대각선 성분은 1이고 나머지는 모두 0인 정방행렬을 단위행렬이라고 한다.

2차 단위행렬은

I=[1001]I = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix}

이다.

단위행렬은 곱셈에서 항등원 역할을 한다.

AI=IA=AAI = IA = A

그리고 벡터에 적용하면 아무것도 바꾸지 않는다.

I[xy][xy]I \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}

즉, 단위행렬은 “아무 변화도 일으키지 않는 사상”이다.

대각행렬

대각선 바깥의 성분이 모두 0인 행렬을 대각행렬이라고 한다.

예를 들어

D=[2003]D = \begin{bmatrix} 2 & 0 \\ 0 & 3 \end{bmatrix}

는 대각행렬이다.

이 행렬은

D[xy][2x3y]D \begin{bmatrix} x \\ y \end{bmatrix} \begin{bmatrix} 2x \\ 3y \end{bmatrix}

처럼 각 좌표 방향을 독립적으로 늘이거나 줄인다. 그래서 대각행렬은 좌표축 방향으로 크기를 조절하는 가장 단순한 변환으로 이해할 수 있다.


역행렬은 역사상이다

네가 적어준 “역행렬 = 역사상”은 문맥상 역행렬은 역 사상이다로 읽는 것이 가장 자연스럽다. 이 의미가 정확하다.

어떤 행렬 AA가 벡터를 다른 벡터로 보내는 사상이라면, 그 과정을 정확히 되돌리는 사상이 있을 수 있다. 그 되돌리는 사상이 바로 역사상이고, 그것을 행렬로 나타낸 것이 역행렬이다.

행렬 A1A^{-1}가 존재해서

A1A=AA1=IA^{-1}A = AA^{-1} = I

를 만족하면, A1A^{-1}AA의 역행렬이라고 한다.

이 식의 뜻은 분명하다.

  • 먼저 AA를 적용하고 다시 A1A^{-1}를 적용하면 원래대로 돌아오고
  • 먼저 A1A^{-1}를 적용하고 다시 AA를 적용해도 원래대로 돌아온다

즉, 역행렬은 변환을 완전히 취소하는 장치다.

예를 들어

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

의 역행렬은

A1=[12001]A^{-1} = \begin{bmatrix} \frac{1}{2} & 0 \\ 0 & 1 \end{bmatrix}

이다.

왜냐하면

A1A[12001][2001][1001]=IA^{-1}A \begin{bmatrix} \frac{1}{2} & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 2 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = I

이기 때문이다.

공간적으로 보면, AA는 x축 방향을 2배로 늘리는 변환이고, A1A^{-1}는 그것을 다시 절반으로 줄여 원래 상태로 되돌리는 변환이다.

다만 모든 행렬이 역행렬을 갖는 것은 아니다. 어떤 변환은 정보를 잃어버리기 때문이다. 예를 들어 평면 전체를 한 직선 위로 눌러버리는 변환이 있다면, 여러 점이 같은 점으로 겹쳐져 버린다. 그러면 어느 점이 원래 어디서 왔는지 복원할 수 없다. 즉, 되돌리는 규칙이 존재하지 않는다. 이런 행렬은 역행렬이 없다.

프로그래밍으로 생각하면, 역행렬이 있는 사상은 복원 가능한 변환이다. 인코딩 후에 완전히 되돌릴 수 있는 경우와 비슷하다. 반대로 역행렬이 없는 변환은 정보가 압축되거나 사라져서 원상복구가 불가능한 경우라고 볼 수 있다.