ashen-aetna-ko

잿빛의 에트나(Ashen Aetna)

— 재 덮인 화산 위에서 녹슬도록 비틀거리며

(3D 그래픽스, Rust, Vulkan, ash에 대한/속의/관한/함께하는 튜토리얼)

벡터, 선형 사상 그리고 행렬

벡터

공간에서의 점과 방향을 다룰 때 선택되는 수학적 개념은 벡터(vector)입니다.

벡터란 무엇일까요?

형식적으로 올바른 답변은 “벡터 공간의 원소”일 수 있고, 이는 “그럼 벡터 공간은 무엇인가요?”라는 질문을 유발할 수 있습니다. 하지만 결국 “숫자를 곱할 수 있고 다른 벡터와 더할 수 있는 것”으로 요약됩니다 (각주: 여기서 곱셈과 덧셈은 우리가 합리적으로 기대하는 방식대로 동작합니다). 예시 (“무언가”라는 표현이 벡터에 대한 감을 잡는 데는 그다지 도움이 되지 않는다는 점은 인정합니다): 다음과 같은 세 숫자의 조합,

또는 더 정확하게는, 다음 모두가 해당됩니다.

이것들 중 두 개를 더하거나, 숫자를 곱하는 것을… 한번 보죠. 이건 어떨까요?

그리고

저는 괜찮아 보입니다. 그리고 이 규칙들은 에서의 일반적인 덧셈과 곱셈에 기반하므로, 각주가 아니었던 각주에서 언급된 추가적인 요구사항들이 모두 만족된다고 확신할 수 있습니다. (물론 이걸 확인해볼 수도 있지만, 그러려면 “기대하는 대로 작동한다”는 것이 무엇을 의미하는지 자세히 설명해야 하고, 저는 벡터 공간의 정의에 대해 더 자세히 이야기하는 것을 피하고 싶습니다.)

이 정의는 또한 모든 벡터를 다음과 같이 분해할 수 있게 합니다:

또는

만약 우리가 , , 라는 새로운 이름을 도입한다면 말이죠.

좋습니다, 그럼 예를 들어 저 세 숫자의 조합들은 벡터입니다.

다른 의미도 있을까요? 예를 들어 좀 덜 추상적인 의미는요?

물론입니다. 공간에서의 움직임은 어떨까요?

이동(“translations”, 언어 번역이 아닌)을 생각해 봅시다. 그리고 가 무언가를 오른쪽으로 1미터, 아래로 2미터, 그리고 앞으로 3미터 움직이는 것을 의미한다고 해봅시다. 이동에 숫자를 곱할 수 있을까요? 물론이죠. 3을 곱하면 3배 더 멀리 이동하는 것을 의미합니다. 두 이동을 더할 수 있을까요? 두 개의 이동을 차례대로 수행한다고 상상해 보세요. 그러면 단 한 번의 (다른) 이동으로도 같은 결과를 얻을 수 있다는 것을 깨닫게 될 겁니다. 자, 그 한 번의 이동을 이전 두 이동의 합이라고 부릅시다. (사실, “오른쪽으로 1미터, 아래로 2미터, 그리고 앞으로 3미터 움직인다”는 제 설명은 이미 이 개념을 내포하고 있는 것 같습니다.) 그래서 이러한 이동들은 또 다른 벡터 공간을 형성합니다. , , 는 각각 오른쪽, 아래, 앞으로의 움직임이며, 우리는 모든 이동을 이들의 배수의 합으로 설명할 수 있습니다.

비슷한 맥락에서, 벡터는 종종 “화살표”로 시각화됩니다(두 화살표가 시작점이 같지 않더라도 길이와 방향이 같으면 같은 것으로 간주됩니다). 또한 벡터로 가장 잘 표현되는 많은 물리량들이 있습니다(가장 두드러진 예 중 하나로 크기와 방향을 가진 속도가 있습니다).

점은 어떤가요? 우리의 목표는 점을 정의하는 것이었습니다. 점도 벡터 공간을 형성할까요?

음, “두 점을 더한다”는 것이 무엇을 의미해야 하는지는 그리 명확하지 않습니다. 그러니: “아니오”에 가깝다고 할 수 있을까요? (적어도 명백한 의미를 가진 덧셈에 국한한다면요.)

하지만 우리가 하나의 특별한 점(“원점”)을 지정한다면, “한 점”과 “원점에서 이 점까지 가는 데 필요한 이동”(또는 “원점에서 이 점까지의 화살표”)은 서로 교환 가능하다고 합리적으로 주장할 수 있습니다. 해당 덧셈과 숫자 곱셈을 사용하여 “점 더하기 점”에 의미를 부여할 수 있고, 곧이어 당연히 두 점을 더할 수 있다고 주장하게 될 것입니다. — 그러한 연산이 얼마나 의미 없는지와는 상관없이 말이죠 (그리고 점과 점의 덧셈보다는 점과 이동/화살표의 덧셈에 대해 이야기하는 것이 훨씬 더 이치에 맞을 것이라는 사실과도 무관하게 말입니다). “어떤 점 곱하기 2”는 단지 “원점에서 두 배 더 멀지만 같은 방향에 있는 점”입니다. 보통 점과 “화살표”(벡터)를 구분하는 것이 “그럴 만한 가치가 있다”고 여겨지지는 않습니다. 그런 의미에서: 우리 화면의 점들은 벡터이며, 우리는 세 개의 구성 요소로 그것들을 표기합니다.

선형 사상, 행렬

이제 점이 생겼으니, 한 점을 다른 점으로 변환하는 방법을 알아봅시다. “변환”? 음, 어떤 점 를 가져다가, 무언가를 해서, (아마도 다른) 점 를 얻는 과정입니다. 그리고 우리는 그 설명에서 “무언가”를 강력하게 제한할 것입니다. 바로 잘 알려져 있고 다루기 매우 쉬우며 유용한 형식 체계를 갖춘 변환 클래스인 선형 변환(Linear transformations)으로 말이죠.

선형 함수란 무엇일까요? 선형성(Linearity)은 그것들이 벡터 공간을 정의하는 데 필요했던 두 가지 연산, 즉 두 벡터의 덧셈과 숫자와 벡터의 곱셈과 잘 어울린다는 것을 의미합니다.

“잘 어울린다”는 것은 순서가 중요하지 않다는 뜻입니다(함수를 먼저 적용하고 숫자를 곱하는 것과, 먼저 곱하고 함수를 적용하는 것이 같습니다):

(숫자 λ와 벡터 v, w의 모든 가능한 선택에 대해).

모든 함수가 선형인 것은 아니지만, 이것은 여전히 매우 크고 중요한 부분을 차지합니다. (그리고 다른 함수들이 “국소적으로” 그리고/또는 “근사적으로” 선형이라고 가정하는 기술들이 있습니다 — “미분”이 여기서 핵심 단어겠지만, 지금 당장은 우리와 관련이 없습니다.)

한 가지 예는 “각 점을 자기 자신과 원점 사이의 중간으로 이동시키기”나 “양의 z 방향을 바라볼 때, (각) 점을 z축을 기준으로 반시계 방향으로 4분의 1 바퀴 회전시키기”가 될 수 있습니다. 즉, 크기 조절(scaling)과 회전(rotation)은 선형입니다. 이러한 설명은 길어질 수 있습니다. 다행히도, 그럴 필요가 없습니다.

첫 번째 관찰: 선형 변환이 , 그리고 에 대해 무엇을 하는지 안다면, 그것으로 정보는 충분합니다.

왜냐하면 우리는 모든 벡터 로 쓸 수 있고, 가 선형이기 때문에 다음을 얻을 수 있기 때문입니다.

예를 들어, , , 라고 합시다. 또는 줄 높이가 낮은 더 긴 형식을 선호한다면:

, , .

사상을 설명하기 위한 아홉 개의 숫자, 또는 하나의 숫자 표, 즉 “행렬(matrix)”입니다:

우리는 행렬 와 벡터 의 곱을 다음과 같이 정의합니다:

그렇게 하면 가 실제로 일치하게 됩니다.

우리의 예시들을 이 틀에 넣어보면 다음과 같습니다: “각 점을 자기 자신과 원점 사이의 중간으로 이동시키기” (일명 모든 것을 작게 만들기): 로 변환되므로,

가 되므로,

그리고 도 비슷하게 로 사상되므로, 우리는 결국

를 얻습니다.

“양의 z 방향을 바라볼 때, (각) 점을 z축을 기준으로 반시계 방향으로 4분의 1 바퀴 회전시키기”: z에 대해 회전한다는 것은 가 고정된다는 의미이므로( 로 사상됨), 행렬을 쉽게 채워나갈 수 있습니다:

그리고 우리는 (처음에는 오른쪽을 향함)가 회전 후에는 (위쪽을 향함)가 되는 것을 관찰합니다.

그리고 (원래는 아래를 향함)는요? 회전 후에는 오른쪽을 가리킵니다: , 즉

만약 우리가, 예를 들어, 를 회전시키고 싶다면, 다음과 같이 계산합니다.

나쁜 소식: 모든 변환이 선형인 것은 아니며, 우리가 놓치고 있는 중요한 경우들이 있습니다:

계속