1. 정의


행렬식은 n by n 행렬인 정방행렬일 경우 해당 행렬을 하나의 수에 대응시키는 함수입니다. 행렬 M 이 있을때 이를 실수 a로 대응시키는 함수이지요. 정리하면 행렬 A

의 행렬식은 

또는

라고 표현합니다. 행렬식은 n by n 행렬을 기준으로 재귀함수를 이용하여 구할 수 있습니다. 재귀함수는 수학에서 배우는 재귀이거나 컴공에서 배우는 재귀나 같은 의미로 함수 내부에서 함수를 호출하여 초기값을 기준으로 순서대로 값을 구해나가는 과정을 표현한 함수입니다. 행렬식을 재귀적으로 구하기 위해서는 초기값이 필요합니다. 따라서 행렬 A의 n차 정방행렬을 표현하는 기호를 하나 정의하고 다음 이야기를 하도록 하겠습니다. 행렬 A의 n차 정방행렬의 행렬식은

으로 표현할때, 초기값을 

로 표현합니다. 그리고 나머지 n = 1, 2, ...  인 행렬은 재귀적으로 구하게 됩니다. 

1) n = 1 인 경우

n = 1 인 경우는 행렬의 원소가 1개이기 때문에 행렬식은 해당 원소와 대응하게 됩니다. 

2) n = 2 인 경우

n = 2 일때 부터 어느정도 재귀적인 규칙이 보이기 시작하는데요. 일반적으로 대각선 원소끼리 곱해서 빼는 방식으로 표현합니다. 따라서 a와 d를 곱하고 b와 c를 곱하여 뺀 결과가 2 by 2 행렬의 행렬식이 되는 것입니다. 

3) n = 3 인 경우

n = 3 일때는 1행을 기준으로 아래에 있는 원소로 2 by 2 행렬을 만들어 행렬식을 구하여 연산을 하게 됩니다. 이때 1행의 원소인 a, b, c는 순서대로 1, -1, 1 을 곱하게 됩니다. 그리고 1열인 a 원소를 선택했을때 2, 3 열의 원소로 행렬을 만듭니다. 그렇게 되면 3 by 3 행렬의 행렬식은 2 by 2 행렬의 행렬식의 연산으로 표현됩니다. 그리고 위의 2 by 2 행렬의 연산을 풀어쓰면

로 표현할 수 있습니다. 이렇게 재귀적으로 구하는 함수를 일반화하여 코드로 작성하면 쉽게 결과를 찾을 수 있습니다.


2. 활용

행렬식은 다양한 분야에서 활용될 수 있습니다. 가장 많이 사용되는 곳이 역행렬을 구하기 위해서 사용됩니다. 역행렬은 A라는 행렬을 기준으로 해당 행렬에 역행렬을 곱하게 되면 단위행렬이 나오는 행렬입니다. 행렬 A의 역행렬은 

으로 표현하고 행렬 A의 역행을 행렬식을 활용하여 표현하면

으로 표현할 수 있고 이때 행렬식이 0이 된다면 역행렬을 구할 수 없게 됩니다. 따라서 해당 행렬의 역행렬이 존재하는지 확인하기 위해서는 행렬식이 존재하는지 먼저 확인하면 따로 계산을 할 필요가 없이 해당 행렬이 가역행렬인지 확인할 수 있습니다.

또 행렬식은 기하학적으로 활용이 가능합니다. 2차 직교좌표계에서 행렬 A는 2 by 2 행렬입니다. 이때 한개의 열을 하나의 벡터로 생각하면 

다음과 같이 표현할 수 있습니다. 따라서 기존의 x축 y축 기저를 해당 벡터로 변환하는 행렬이 됩니다. 이때의 행렬식은 두 벡터를 이용하여 만든 사각형의 넓이가 됩니다. 3차 공간좌표계에서는 행렬식이 해당 행렬로 변환한 도형의 부피가 됩니다. 4차, 5차도 이와 같은 기하학적 의미가 통용되지만 일반적으로 사람이 생각할 수 있는 수준을 벗어나기 때문에 선형대수정도에서만 사용하는 개념이 됩니다.

기하학에서 점만큼 중요한 개념이 있는데요. 바로 벡터입니다. 벡터는 수학에서도 사용되지만 물리에서도 사용되는 개념입니다. 아마 물리 수업시간에 수업을 들으신 분들은 기억하고 있으실텐데요. 벡터와 스칼라에 대해서 배웠을 것 입니다. 벡터는 크기와 방향이 있는 성분이고 스칼라는 크기만 있다 라고요. 수학에서도 벡터와 스칼라가 있습니다. 두 학문에서 사용하는 개념은 거의 비슷하다고 볼 수 있습니다. 

일반적으로 n 차원의 벡터는 다음과 같이 생겼습니다.

벡터는 행렬과 비슷한 형태를 하고 있는데요. 실제로 행이 n 개이고 열이 1개인 행렬입니다. 반대로 행렬은 벡터의 모임으로 볼 수 있는데요. 이는 나중에 행렬식을 다루면서 자세하게 이야기하도록 하겠습니다. 오늘은 벡터의 연산에 대해서 알아보도록 하겠습니다. 

1, 벡터의 덧셈 

벡터의 덧셈은 행렬의 덧셈과 마찬가지로 더하고자 하는 벡터의 크기가 같아야 합니다. 즉 원소가 3개인 벡터와 원소가 4개인 벡터는 서로 덧셈이 불가능합니다. 물론 이 벡터를 차원의 개념으로 확장한다면 같은 차원의 원소끼리 덧셈이 가능하겠지만 일반적인 연산을 하기 위해서 원소의 개수가 같아야 합니다. 아래 두 개의 벡터를 더하는 예제를 통해서 덧셈이 어떻게 이루어지는지 알아보도록 하겠습니다.

다음과 같이 두개의 벡터가 있을때 두 벡터의 합은 다음과 같이 연산됩니다.

2. 벡터의 뺄셈

벡터의 뺄셈은 덧셈과 같은 방법으로 + 기호 대신에 - 기호를 사용하면 됩니다. 따라서 위에서 예제로 든 두 벡터를 뺀다면 다음과 같은 결과를 얻을 수 있습니다.

지금까지의 덧셈과 뺄셈은 수학적인 계산에 의한 결과였습니다. 이를 기하학적으로 생각한다면 어떻게 될까요? 위에서 벡터는 방향성분이 있다고 했습니다. 그래서 덧셈은 기존의 벡터에 다른 나머지 벡터를 같은 방향으로 움직는 것이 되고, 뺄셈은 기존의 벡터와 반대 방향으로 움직인다고 생각하면 되는 것입니다. 그래서 실제로 벡터를 -1 만큼 스칼라배를 한 것을 덧셈한 결과와 벡터를 뺄셈한 결과는 갖게 됩니다. 

3. 스칼라배

벡터의 스칼라배는 행렬의 스칼라배와 같이 각 원소에 상수만큼 늘리는 것인데요. 

다음과 같은 벡터가 있다고 가정해봅시다. 이 벡터는 2차원 직교좌표계에서 X축을 표현하는 벡터입니다. 다음 벡터에 2만큼 스칼라배를 하게 되면 다음과 같은 식이 성립합니다.

이 결과를 2차원 직교좌표계에서 생각한다면 기존의 벡터의 길이만큼 2배가 되는 것입니다.


마지막으로 계획에는 없었는데 벡터의 길이에 대한 이야기가 나와서 길이를 구하는 방법에 대해서 이야기해보겠습니다. 벡터의 길이는 원점을 기준으로 벡터의 길이를 계산합니다. 2차원에서 삼각형의 빗변의 길이를 구하는 공식과 같습니다. 정확히 말하면 n 차원에서 두 점으로 생기는 선분의 길이입니다. 이때 한 점은 원점이고 나머지 한 점은 벡터의 끝점이 되는 것이죠. 따라서 공식은 아래와 같습니다.

와 같은 벡터의 길이를 L 이라고 하면

 

컴퓨터를 통해서 기하학을 다루다보면 기초적인 수학개념이 많이 필요하고 이런 개념을 정확히 알고 있어야지 최적화된 알고리즘을 개발할 수 있습니다. 그래서 오늘은 행렬 연산에서 가장 기본적인 덧셈, 뺄셈, 곱셈, 스칼라에 대해서 이야기를 하겠습니다. 우선 행렬은 쉽게 연산을 할 수 있는 것이 아니고, 행렬을 연산하기 위해서는 조건이 필요합니다. 덧셈과 뺄셈을 하기 위해서는 행렬의 행과 열의 수가 일치해야하고, 곱셈을 하기 위해서는 곱하는 행렬의 앞 행렬과 뒤 행렬의 열과 행이 일치해야합니다. 그렇다면 이제부터 자세하게 다뤄보도록 하겠습니다.

1. 덧셈

두 행렬의 덧셈을 하기 위해서는 두 행렬의 열과 행이 서로 같아야합니다. 예를 들어서 2 x 3 행렬과 3 x 2 행렬은 각각 열과 행이 서로 다르기 때문에 덧셈이 불가능합니다. 2 x 3 행렬과 2 x 3 행렬은 덧셈이 가능합니다. 덧셈을 하는 방법은 각 행렬의 같은 위치의 원소들끼리 더하기를 해서 새로운 행렬에 같은 위치의 원소가 됩니다.

예를 들어보겠습니다. 아래 2 by 3 행렬 A와 2 by 3 행렬 B가 있다고 하겠습니다.

이때 행렬 A와 행렬 B를 더한 행렬을 C 라고 하면 다음과 같이 계산됩니다.

따라서 행렬 C는 

가 되는 것을 알 수 있습니다.

2. 뺄셈

뺄셈도 덧셈과 마찬가지로 두 행렬의 크기가 같아야합니다. 그리고 덧셈을 뺄셈으로 바꾸면 되는 것입니다. 이에 대한 예제는 덧셈과 거의 비슷하기 때문에 따로 다루지 않겠습니다. 여기서 한가지 알아둬야하는 것이 있는데요. 행렬의 덧셈과 뺄셈은 교환법칙이 성립합니다. 즉 A + B = B + A 가 성립합니다. 그리고 A + B + C + ...  + Z 를 순서를 아무리 바꿔서 연산을 하여도 결과는 그대로입니다. 

3. 곱셈

행렬의 곱셈의 경우 행렬이 서로 붙는 부분이 있는데요. 이 붙는 부분의 크기가 같을때 곱셈을 할 수 있습니다. 예를 들어 2 by 3 행렬은 각각 아래와 같이 생겼는데요.

만약에 이렇게 생긴 두개의 행렬이 곱셈이 가능할까요? 정답은 불가능합니다. 왜냐면 곱셈은 앞의 행렬의 열과 뒤의 행렬의 행의 수가 같아야 곱셈이 가능합니다. 

곱셈의 결과는 앞의 행렬의 행과 뒤 행열의 열만큼의 크기의 행렬이 됩니다. 위에 행렬이 2 by 3 행렬과 3 by 2 행렬의 곱은 2 by 2 행렬이 됩니다.

곱셈은 다음과 같이 이루어지는데요. 파란선을 기준으로 a, b, c와 A, C, E를 각각 곱해서 더하여 (1,1) 의 원소가 됩니다. 또 노란선을 기준으로 a, b, c와 B, D, F를 각각 곱해서 (1, 2)의 원소가 됩니다. 이런식으로 각 색깔별로 차례로 곱해서 행렬을 완성합니다. 실제 결과는 아래와 같습니다.

4. 스칼라

스칼라는 행렬의 크기와 상관 없이 행렬의 모든 원소에 일정한 상수를 곱하는 것입니다. 이는 각 행렬을 늘리는 것과 같은 의미인데요. 행렬을 n차원의 벡터로 생각한다면 모든 벡터를 늘리는 것과 같은 의미가 됩니다. 

다음과 같은 행렬에 2를 스칼라배 한다면 각각의 원소에 2를 곱해서

가 됩니다.

형렬은 영어로 Matrix라고 부릅니다. 행과 열을 갖고 있는 일정한 단위입니다. 행렬에 대한 종류는 여러가지가 있고 이를 계산하는 방법도 여러가지가 있습니다. 이번 포스팅부터 행렬에 대해서 하나씩 알아보도록 하겠습니다. 우선 행렬의 종류부터 알아보도록 하겠습니다. 행렬의 종류는 행렬의 형태에 따라서 종류가 나뉩니다. 행렬의 종류는 정방행렬, 대각행렬, 삼각행렬, 단위행렬, 영행렬, 전치행렬, 직교행렬이 있습니다. 

1. 정방행렬 (Square Matrix)

정방행렬은 행과 열의 수가 같은 행렬입니다. N by N Matrix로 표현될 수 있습니다. 정방행렬의 경우 행렬방정식의 기본이 되는 행렬이 됩니다. 그래서 차수가 N인 정방행렬은 차수가 N인 행렬입니다. 

2. 대각행렬 (Diagonal Matrix)

대각행렬은 주대각선 원소를 제외한 모든 원소들이 0인 정방행렬을 의미합니다. 여기서 주대각선 원소라고 하면 한 행렬에서 (0,0), (1,1), (2,2), ... , (n,n) 원소를 의미합니다. 행렬에서 대각선 방향에 위치한 원소들입니다. 

3. 삼각행렬 (Triangular Matrix)

삼각행렬은 주대각선 원소를 기준으로 위 또는 아래에 있는 성분이 모두 0인 정방행렬을 삼각행렬이라고 합니다. 여기서 만약에 위의 성분이 모두 0이라고 하면 이를 하삼각행렬(Lower Triangular Matrix)라고 부르고, 아래의 성분이 모두 0이라고 하면 이를 상삼각행렬(Upper Triangular Matrix)라고 부릅니다.  앞으로 삼각행렬을 이용한 다양한 방법들이 다루어질 예정이기에 잘 기억해주야합니다.

4. 항등행렬 (Identity Matrix)

항등행렬은 행렬 곱셈 연산에 항등원으로 작용하는 행렬입니다. 주대각선 성분이 모두 1인 정방행렬로 해당 행렬에 다른 행렬을 곱하면 결과는 곱한 행렬이 그대로 나오게 됩니다. 이를 단위행렬이라고 부르기도 합니다.  

5. 영행렬 (Zero Matrix)

영행렬은 모든 원소가 0인 행렬로 곱셈 연산에서 영원으로 작용하는 행렬입니다. 만약에 어떤 행렬을 영행렬에 곱하면 결과는 영행렬이 나옵니다. 

6. 전치행렬 (Transpose Matrix)

전치행렬은 주대각선 원소를 기준으로 행과 열을 바꿔주는 행렬입니다. 행과 열을 바꾸기 때문에 주대각선 원소는 변하지 않습니다. 전치행렬은 T 로 표현하는데요. 행렬 A의 전치행렬은

$ A ^T $ 

로 표현합니다.

7. 직교행렬 (Orthogonal Matrix)

직교행렬은 행렬 A의 역행렬이 A의 전치행렬이고 A의 전치행렬과 A 행렬을 곱하였을때 항등행렬이 나오는 행렬입니다. 역행렬은 $$A^{-1}$$로 표현하고 이때 다음과 같은 공식이 성립합니다.

$ A^-1 $ = $ A^T$ , $ A^T A = I $

 

지난 2차원 직교좌표계에서 이동과 회전에 대해서 어떻게 움직이는지에 대해서 알아보았습니다. 관련 포스팅은 아래를 참고하시면 보실 수 있습니다. 그리고 오늘은 3차원 공간에서 이동행렬과 회전행렬에 대해서 알아보도록 하겠습니다. 여기서 말하는 공간은 유클리드 공간을 의미합니다.

https://math-development-geometry.tistory.com/50

 

행렬을 이용한 이동, 회전, 스케일 (Translate, Rotate, Scale)

2차원 직교좌표계에서 모든 것은 점의 집합으로 표현할 수 있습니다. 예를 들면 선은 두개의 점을 잇는 점들의 집합이고 삼각형은 3개의 점을 잇는 선들을 만드는 점들의 집합이고, 원은 원의 중심을 기준으로 반..

math-development-geometry.tistory.com

우선 이동행렬에 대해서 이야기를 하고 회전행렬은 X축, Y축, Z축에 대한 회전을 알아보도록 하겠습니다. 그리고 나중에 시간이 된다면 임의의 축에 대한 회전도 알아보도록 하겠습니다. 

1. 이동행렬 (Translate Matrix)

이동행렬의 기본은 2차원 직교좌표계와 같이 점을 기준으로 움직인다고 생각하면 됩니다. 3차원 공간이기 때문에 점은 X축, Y축, Z축 이렇게 3가지 방향으로 움직일 수 있습니다. 이때 움직이는 방향의 값을 각각 Tx, Ty, Tz 라고 하면 점 (0, 0, 0)은 (Tx, Ty, Tz)로 이동하게 됩니다. 이를 행렬로 표현할 수 있습니다. 이때 사용하는 행렬은 4 by 4 행렬이고 이는 열과 행이 4개의 원소로 되어있습니다. 그리고 곱하는 점은 (x, y, z, 1) 인 벡터로 표현하게 됩니다. 

 행렬로 이렇게 표현할 수 있고 여기서 Tx, Ty, Tz는 각각 곱하는 점의 X, Y, Z와 더해지게 됩니다. 실제 이 행렬을 M이라고 하고, 이동하기 전의 점을 벡터로 표현한 것을 A라고 하고 결과를 B라고 하면 

B = MA 

가 성립하게 됩니다. 따라서 B는 (X + Tx, Y + Ty, Z + Tz, 1) , A는 (X, Y, Z, 1)이 됩니다. 

2. 회전행렬 (Rotation Matrix)

회전행렬은 일반적으로 X, Y, Z축에 대해서 회전을 하는 행렬을 이용해서 임의의 축을 기준으로 회전하는 행렬까지 확장하게 됩니다. 우선 이번 포스팅에서는 각 축에 대해서 회전하는 행렬에 대해서 알아보도록 하겠습니다. 회전행렬도 기존의 이동행렬과 마찬가지로 점을 기준으로 회전하는 것입니다. 점이 회전되면 모든 도형을 회전할 수 있습니다.


1) X축

X축을 기준으로 회전하는 행렬은 아래와 같습니다.

해당 행렬을 M이라고 하고 회전하기 전의 점을 B 회전 이후 점을 A라고 하면 A = MB 라고 표현할 수 있습니다. 이때 행렬을 곱하면 B 벡터의 X좌표는 1을 곱하기 때문에 변하지 않습니다. 그리고 나머지 Y축 Z축 좌표는 기존의 2차원 직교좌표계와 같은 방법으로 회전을 하는 것입니다. 


2) Y축

Y축을 기준으로 회전하는 행렬은 아래와 같습니다.

Y축을 기준으로 회전하는 행렬은 Y좌표에 1을 곱하기 때문에 변하지 않고 X축 Z축이 변하게 됩니다.


3) Z축

Z축을 기준으로 회전하는 행렬은 아래와 같습니다.

Z축을 기준으로 회전하는 행렬은 Z좌표에 1을 곱하기 때문에 변하지 않고 X축 Y축이 변하게 되는 것입니다. 이렇게 원리를 파악하게 되면 쉽게 행렬을 기억할 수 있습니다. 다음에는 이 3가지 행렬을 이용하여 임의의 축에 대해서 회전하는 방법에 대해서 이야기하도록 하겠습니다.

 

2차원 직교좌표계에서 모든 것은 점의 집합으로 표현할 수 있습니다. 예를 들면 선은 두개의 점을 잇는 점들의 집합이고 삼각형은 3개의 점을 잇는 선들을 만드는 점들의 집합이고, 원은 원의 중심을 기준으로 반지름만큼 떨어진 점들의 집합입니다. 이렇듯 2차원 직교좌표계에서 어떤 것을 표현하기 위해서 가장 기본이 되는 원소는 점입니다. 따라서 이 점을 회전하거나 이동하게 되면 모든 것을 회전하거나 이동할 수 있습니다. 이동, 회전, 스케일에 대해서 각각 어떻게 이루어져있고 어떤 방법으로 계산할 수 있는지 알아보도록 하겠습니다.

1. 이동 (Translate)

이동은 XY평면에서 2가지 방향이 존재합니다. X축과 평행한 방향, Y축과 평행한 방향 이렇게 두가지가 있고 이 두가지를 조합하면 모든 이동을 표현할 수 있습니다. 

점 A의 좌표는 (4, 3) 입니다. 맨 처음에 점 A가 (0,0) 에 있다고 가정할때 현재의 위치로 이동하기 위해서는 X축으로 4만큼 Y축으로 3만큼 이동하게 됩니다. 점 B의 좌표는 (-2, -3) 입니다. 맨 처음 점 B가 (0, 0)에 있다고 가정하면 이때 점 B는 X축으로 -2만큼 Y축으로 -3만큼 이동한 것입니다. 이것을 일반화하면

이동하기 전의 점을 A(x0, y0) 라고 가정할때 이 점이 A(x1, y1)로 이동했다면

X축으로 x1 - x0 만큼 y축으로 y1 - y0 만큼 이동하였다.

라고 말할 수 있습니다. 이는 방정식처럼 수학적으로 계산한 것인데요. 이를 행렬을 이용하여 표현할 수 있습니다. 2차원 직교좌표계에서 이동을 행렬로 표현하기 위해서 3 by 3 행렬이 필요한데요. 열과 행이 모두 3개씩인 행렬입니다. 

다음과 같은 이동 행렬을 이용하여 X축으로 X만큼 Y축으로 Y만큼 이동할 수 있습니다. 이 행렬을 M이라고 하면 점 A가 점 B로 이동할때 M 행렬을 이용한다고 하면 B = A * M 이 되는 것입니다. 

2. 회전 (Rotate)

회전은 2차원 직교좌표계이기 때문에 해당 평면 위에서만 회전을 한다고 생각해야 합니다. 즉 회전축은 가상의 Z 축이라고 생각하면 됩니다. 그리고 회전을 하는 기준점이 필요합니다. 그리고 얼마만큼 회전할지 각도가 필요합니다.  

점 A가 처음에 (5, 0) 에 있다가 원점(0, 0)을 기준으로 일정한 각도만큼 회전하여 A(4, 3)이 되었습니다. 이때 삼각함수를 이용하여 원점에서 점 A까지의 거리가 5인 것을 알고 삼각형의 밑변과 높이를 각각 점 A의 X좌표, Y좌표가 되면 회전이 되는 것입니다. 이를 원점을 기준으로 회전이 이루어졌지만, 항상 회전이 원점을 기준으로 이루어지지 않습니다. 이때는 해당 점을 기준으로 이동을 먼저 하여 원점으로 이동하여 회전을 하고 다시 이동을 할 수도 있고, 이동할 점이 원점에 있다고 가정하고 회전을 하고 다시 이동을 하는 방법이 있습니다. 이를 행렬로 표현하면

다음과 같이 표현할 수 있습니다. θ 는 회전 각도입니다. 해당 행렬에서 (1, 3)과 (2, 3)의 원소가 0인 것을 알 수 있는데요. 0인 이유는 원점을 기준으로 했다는 뜻이기 때문입니다. 만약에 원점을 기준으로 한 것이 아니라면 각각 회전 기준점의 X좌표, Y좌표가 들어가게 되는 것이죠.

3, 스케일 (Scale)

스케일은 늘리는 것을 의미하는데요. (1, 0)을 2배로 늘리면 (2, 0) 되는 것을 의미합니다. 스케일은 정말 간단한데요. X축으로 늘리고 싶은 스케일을 Sx라고 하고 Y축으로 늘리고 싶은 스케일을 Sy라고 하면 각 좌표에 Sx와 Sy를 곱하면 되는 것입니다. 따라서 이를 행렬로 표현하면

다음과 같은 행렬로 쓸 수 있습니다. 일반적으로 이동과 회전 행렬은 한번에 적용이 가능하지만 스케일은 조금 다르기 때문에 한번에 같이 적용하지는 않습니다. 

다음에는 2차원이 아닌 3차원에서 각 변환이 어떻게 이루어지는지 알아보도록 하겠습니다.

+ Recent posts