행렬 (Matrix) 이론
행렬이란?
- 행렬은 가로와 세로로 나열된 수의 집합으로, 원하는 만큼의 행과 열을 가질 수 있습니다.
- 벡터는 한 행만 가지는 single-row matrix 라고도 합니다.
- 행렬은 각종 변환 ( 이동 / 회전 / 스케일 )등 각종 연산을 효율적으로 할 수 있습니다.
3x3 행렬은 다음과 같이 정의합니다.
행렬의 원소 자리엔 수식이 올 수 도 있고 실수가 올 수 도 있습니다.
행렬의 상동
- 두 행렬이 상동인가 ( 같은 행렬인가? ) 를 알아보려면 다음과 같은 조건을 만족하는지 확인하면 됩니다.
1. 크기가 같은가?
2. 모든 원소가 동일한가?
예를 들어 다음과 같은 행렬이 A , B 가 있다고 가정할 때, 두 행렬이 상동인지 확인해 보겠습니다.
1. 크기가 같은가?
- A 행렬은 3X2 행렬이고 B행렬은 2X2 행렬입니다. 첫번째 조건부터 성립되지 않아 두 행렬은 상동이 아닙니다.
그럼 다음과 같은 행렬 C , D 는 어떨지 보겠습니다.
1. 크기가 같은가?
- C행렬은 2X3 행렬이고 D행렬 또한 2X3 행렬입니다.
2. 모든 원소가 동일한가?
- 나머진 다 동일한데 2행 3열번째 원소의 값이 각각 6, 9로 다릅니다.
- 따라서 두 행렬은 상동이 아닙니다.
다음 행렬 E, F를 보겠습니다.
1. 크기가 같은가?
- 둘다 3X3 행렬로 같습니다.
2. 모든 원소가 동일한가?
- 모든 원소가 동일합니다. 따라서 E , F는 상동입니다.
행렬의 합
- 두 행렬의 크기가 같을 경우에 계산할 수 있고, 각 원소별로 합을 구하면 됩니다.
아래와 같은 A , B 행렬이 있다고 합시다.
A+B 의 값을 계산할 경우 A의 1행 1열인 1 , B의 1행 1열인 -3 값을 더하는 식으로, 각행 각열 원소를 1:1 대응해 계산합니다.
계산 결과는 다음과 같습니다.
행렬의 차
- 마찬가지로 두 행렬의 크기가 같은 경우에 계산할 수 있고, 각 원소별로 차를 구하면 됩니다.
아래와 같은 A , B 행렬이 있다고 합시다.
A-B 의 계산 결과는 다음과 같습니다.
* 행렬의 합과 차는 반드시 행렬의 크기가 같아야 구할 수 있습니다.
행렬의 곱셈
- 곱셈은 좀 특별합니다. 왼쪽 행렬의 '열'과 오른쪽 행렬의 '행'이 동일해야 합니다.
- 즉 다음과 같은 행렬 A , B 가 있다고 하고 계산해 봅시다.
AXB=C 의 결과는 다음과 같이 계산합니다. ( A의 한 행과 B 의 한 열을 순차적으로 곱하고 더합니다. )
C11 = ( A11 * B11 + A12 * B21 + A13 * B31 )
C12 = ( A11 * B12 + A12 * B22 + A13 * B32 )
C13 = ( A11 * B13 + A12 * B23 + A13 * B33 )
C21 = ( A21 * B11 + A22 * B21 + A23 * B31 )
C22 = ( A21 * B12 + A22 * B22 + A23 * B32 )
C23 = ( A21 * B13 + A22 * B23 + A23 * B33 )
즉,
C11 = ( 2 * (-11) + 1 * (-3) + (-1)*2 ) = ( -22 + (-3) + (-2) ) = -27
C12 = ( 2 * 2 + 1 * 5 + (-1) * 2 ) = 4 + 5 + (-2) = 7
C13 = ( 2 * 0 + 1 * 1 + (-1) * (-6) ) = 0 + 1 + 6 = 7
C21 = ( 0 * (-11) + 7 * (-3) + 3 * 2 ) = 0 + (-21) + 6 = -15
C22 = ( 0 * 2 + 7 * 5 + 3 * 2 ) = 2 + 35 + 6 = 43
C23 = ( 0 * 0 + 7 * 1 + 3 * (-6) ) = 0 + 7 + (-18) = -11
임을 알 수 있습니다.
결과로 얻어지는 행렬은 A(행 2) X B(열 3) 으로 2 X 3 행렬이 얻어집니다.
행렬과 스칼라와의 곱
- 행렬에 스칼라를 곱하는 것은 행렬 사이의 곱보다 간단합니다.
- 각 원소에 스칼라를 곱해주면 쉽게 계산할 수 있습니다.
일 때, 스칼라 k를 곱한다면 kA = Ak 로 표기할 수 있고 계산은 k를 각 원소에 곱하면 됩니다.
k가 2라 할때 2A를 구하면 다음과 같습니다.
정방 행렬(Square matrix)
- 행과 열이 같을때 정방행렬이라 말합니다.
단위 행렬(identity matrix)
* 행렬의 성분 Aij 가 있다고 할 때 i 와 j 가 같은 원소를 대각선 성분이라고 합니다.
* 이때 , 정방행렬일 때 대각선 성분을 제외한 모든 원소가 0일 경우 대각 행렬(diagonal matrix) 라고 하는데,
대각선 성분이 모두 1일 경우 단위 행렬이라 합니다.
3X3 단위 행렬 I.
*단위 행렬은 실수의 곱셈에서 1과 같은 역할을 한다. 즉, 행렬 곱셈에 있어서 '항등원'이 되는 행렬입니다.
따라서 임의의 행렬 A가 있을때 (단 A 는 정방행렬 ) AI = IA = A 라고 할 수 있습니다.
전치 행렬(Transpose matrix)
- 대각선 성분에 대해 대칭 이동한 행렬입니다. m x n 행렬을 n x m 행렬로 바꿔줍니다.
연산 법칙
A , B , C 는 행렬이고 I 는 단위 행렬 0은 0행렬(모든 원소가 0인 행렬) , k와 l 은 스칼라라고 가정할 때
다음과 같은 법칙이 적용됩니다.
1. 덧셈 법칙
(ㄱ) A + B = B + A (교환 법칙)
(ㄴ) (A+B)+C = A+(B+C) (결합법칙)
(ㄷ) A+0=0+A=A
(ㄹ) A+(-A)= 0
2. 스칼라의 곱 법칙
(ㄱ) (k+l)A = kA + lA
(ㄴ) k(A+B) = kA + kB
(ㄷ) (kl)A = k(lA)
(ㄹ) (-1)A = -A
(ㅁ) 0A = 0
3. 곱셈 법칙
(ㄱ) AB ≠ BA (교환 법칙 x)
(ㄴ) A(BC) = (AB)C (결합법칙)
(ㄷ) A(B±C) = AB±AC
(A±B)C = AC±BC (분배법칙)
(ㄹ) AI = IA = A
(ㅁ) k(AB_=(kA)B=A(kB)
(ㅂ) 정방행렬 A 에 대하여
* 가장 중요한 것은 곱셈법칙의 '교환법칙'이 성립되지 않는다는 것입니다.
행렬의 곱셈 순서는 바뀔 경우 다른 결과가 나타날 수 있습니다. ( 변환 에서 더 알아보겠습니다. )
행렬식
*정방 행렬에서만 구할 수 있습니다. 정방 행렬 A 에 대한 행렬식은 다음과 같이 표기합니다.
행렬식을 계산하기 위해 몇가지를 더 정리해보겠습니다.
소행렬식 (minor)
-i,j 소행렬식 Mij 는 mXn 정방 행렬 A 에서 i번째 행과 j 번째 열을 제외한 (n-1) X (n-1) 정방 행렬의 행렬식을 의미합니다.
여인자(cofactor)
로 표현하는 것입니다.
3X3 정방행렬 A 가 주어졌을 때 여인자식 A12 와 A31 을 구해보겠습니다.
여인자 식에 각각 대입하면 다음과 같습니다.
이제 소행렬식을 차례대로 구해보겠습니다.
(소행렬식 M12)
(소행렬식 M31)
다시 여인자식으로 돌아가면 다음과 같이 됩니다.
최종 행렬식은 여인자식을 11부터 33까지 모든 원소들을 구한 뒤에 더하면 됩니다.
즉
(열 성분) 식 A
(행 성분) 식 B
행렬식을 구하는 방법 ( 1 x 1 정방 행렬A = [ a ]의 행렬식은 |A| = a )
2X 2 정방행렬의 경우
대각선 성분 끼리 곱한 뒤에 빼주면 됩니다.
즉 :
(식 A)
(식 B)
최종적으로 2x2 정방행렬의 행렬식은 다음과 같이 구할 수 있습니다.
3X3 정방행렬의 경우
3X3 정방행렬은 다음과 같이 계산하면 쉽습니다.
다음과 같이 대각선으로 차례대로 곱합니다.
:
이 값들은 서로 더합니다.
그리고 반대 방향 대각선끼리 곱합니다. ( - 를 붙여준다 )
서로 더합니다.
최종적으로 전부 더하게 되면 행렬식을 구할 수 있습니다.
* 다음 행렬식을 계산하면 다음과 같습니다.
|A| = 3 * 1 - ( -5 * 2 ) = 3 - (-10) = 30
|B| = (2 * 2 * 3) + (1 * -1 * 2) + (3 * 1 * -1) - ( 2 * -1 * -1) - ( 1 * 1 * 3 ) - ( 3 * 2 * 2 )
= 12 + (-2) + (-3) -2 -3 -12 = - 10
* 행렬식의 특징
(ㄱ)
(ㄴ) n x n 행렬에 대하여, (k는 스칼라)
(ㄷ) |AB| = |A||B|
역행렬 (inverse matrix)
-행렬에는 나눗셈이 없습니다. 유사한 연산을 수행하기 위해 역행렬이라는 개념을 도입했습니다.
정방행렬 A 에 대한 역행렬은 다음과 같이 표기합니다.
역행렬은 다음을 만족합니다.
(I는 단위행렬)
*역행렬은 행렬식의 값이 0인 경우 존재할 수 없습니다. 이를 특이 행렬(singular matrix) 이라 하고, 역행렬이 존재하는 행렬을 가역 행렬(invertible matrix) 라고 합니다.
역행렬을 이용하는 방법
행렬 A, B, X 가 있을 때 특정 행렬 X 를 구하는 경우라고 가정하고, 다음과 같이 식을 구성합니다.
AX = B 식 1
XA = B 식 2
여기서 행렬의 곱셈은 교환법칙이 성립하지 않으므로 두 식은 다릅니다.
여기서 식 1 의 양 변에 A 의 역행렬을 전치시키면 다음과 같이 나타낼 수 있습니다.
식 2를 간단히 했을 때도 마찬가지로 다음과 같이 나타낼 수 있습니다.
역행렬을 구하는 방법
* 먼저 수반 행렬(adjoint matrix) 를 알아야 합니다.
n X n 행렬 A 의 수반 행렬은 ( j , i ) 여인자 Aji 를 (i , j) 번째 성분으로 갖는 행렬을 말합니다.
수반 행렬을 이용하여 역행렬을 계산하는 식을 표현하면 다음과 같습니다.
0으로 나누는 나눗셈은 정의할 수 없으므로, 행렬식이 0이면 역행렬이 존재할 수 없습니다.
일반적으로 게임 프로그래밍에선 2X2 , 3X3 정방행렬을 주로 사용하므로, 3X3 정방행렬의 역행렬을 구해보겠습니다.
다음과 같은 정방행렬 A 가 있다고 가정합니다.
다음으로 행렬식을 계산합니다.
= ( 1 * 1 * -2 ) + ( 0 * (-1) * 0 ) + ( -2 * 3 * 4 ) - (1 * -1 * 4) - ( 0 * 3 * -2 ) - ( -2 * 1 * 0 )
= -2 + 0 + (-24) - ( -4 ) - 0 - ( 0 )
= -2 - 24 + 4 = -22
이제 수반 행렬을 계산해야 합니다. ( 그전에 9개의 여인자를 계산합니다.)
여인자를 계산했으니 수반 행렬과 함께 역행렬을 계산할 수 있습니다.
역행렬의 계산법 까지 알아봤으니 역행렬의 특징을 알아보고 포스트 마치겠습니다.
역행렬의 특징은 다음과 같습니다. (A,B 는 행렬이고 k는 스칼라입니다.)
(ㄱ)
(ㄴ)
(ㄷ)
(ㄹ)
(ㅁ)