본문 바로가기

Theory/Mathmatics

행렬과 연산

저번에 벡터관련 포스팅 중에 마지막에 벡터의 외적을 구할 때 행렬이 잠시 나왔었는데요, 일단 행렬이라 함은 같은 차원으로 이루어진 다항식을 풀기 위해 나온 방법이라고 생각 합니다. 아무래도 이 포스팅 자체는 제가 애초에 올리고 있는 3D 프로그래밍에 대해 이어지는 내용이라서 차원으로 표현 하는 게 적절 할거 같네요.
   
(위키에서는 "수를 네모꼴로 배열한 것" 이라고 하는데... 그것보다 좀 더 와닿는 내용이길 바래요 :-D)
   
일단 2차원에서의 예를 들겠습니다. 고등학교때 배우는건가?_ _;(중학교 인가..?????) 방정식에 대해서 배웠을 텐데 잠시 설명 하자면, 일단 아래와 같은 거?


x와 y를 변수라고 하는데, 이게 바로 차원을 의미하는 거죠. 2개 밖에 없으니까 2차원~ 그리고 우리는 그것을 좌표 평면에 아래와 같이 표현 할 수 있을 거에요.

   
어라? 보통 저렇게 할 때 y를 기준으로 놓고 하지 않나? 할 수 있을 테지만 잠시 넣어주시고...:-D 저 식의 의미 자체는 x와 y에 어떤 수를 넣었을 때 4가 나오는 걸 말합니다. 직선으로 표현 할 수 있겠죠? 왜냐면 궁금한 변수는 두개 인데 주어진 식(단서)는 한 개 밖에 없으니까 그에 따른 x, y의 숫자 조합에 따라 무수히 많은 답을 만들어 낼 수 있으니까요.
   
여기에 또 다른 식을 개입시켜 보지요.

   
그럼 앞서 예시를 든 방정식과 위에 나온 방정식을 동시에 만족하는 x, y는 구할 수 있겠죠? 음? 그냥 y=해서 항 넘긴다음에 푼다구요? 에이 왜 그래요~ 프로답지 않게(무리수 죄송;ㅋㅋ)
   
두 개 의 다항식을 연이어 적어보면 아래와 같이 나옵니다.

   
우리가 구하길 원하고자 하는 것은 x, y의 값이고, 식이 두 개 주어졌어요. 공통 된 차원이죠?(아 뭐 뒤에 0xZ들어가 있다고 말씀 하신다면 딱히 할 말은 없습니다만...) 이걸 이제 행렬로 표현하면 아래와 같이 나오게 됩니다.

   
이제 다 왔네요 :-D 이게 바로 우리가 원하는 행렬식이 되는 거죠. 아래와 같은 일반적인 형식처럼~

   
푸는 방법은 입맛대로 푸시면 됩니다. 지금 이 책에서는 그 부분에 대해서는 언급하지 않고, 행렬 그 자체에 대해서만 풀어 쓰고 있네요.
   
위에 보이는 게 2x2 matrix 이고, 앞쪽에 쓰는 게 "행", 뒤에 쓰는 게 "열"이에요. 2행 2열짜리 행렬인 거죠. 3D안에서는 일반적으로 3x3 행렬을 사용 합니다. 뭐.. 덧붙이자면 실제로 3차원이지만 point와 vector를 구별하기 위한 dimension을 하나 더 추가하게 되거든요. vector를 4개로, 행렬은 4x4로 사용하는데.. 이건 어떻게 접근하느냐에 따라 다른거 니까 일단은 넘어 갈게요.
   
아래는 3x3 matrix 입니다.

   
행렬내부의 특정한 원소를 얘기 할 만한 것이 필요하겠죠? 그게 행과 열입니다. (코딩과 결부시켜서 나오는 내용이다 보니 처음 나오는 숫자는 0으로 하게 되는데 이 부분은 알고 읽어가세요:-D) 제일 첫 열에 첫 행에 있는 것을 0행 0열에 있는 값은 1. 이라고 하면 되는 거죠.
   
이 부분을 보기 좋게 적어 본다면, 아래와 같은 위치에 따른 값들을 표시 할 수 있겠죠?

   
  • The Identity Matrix(단위 행렬)
    대각(diagonal)에 있는 값들은 1이고 이외의 값들은 전부 0을 의미 하는 행렬입니다. scalar에서 1과 같이 곱할 시 자기자신이 그대로 나오듯이, 단위행렬과 곱한 행렬은 그냥 자기 자신이 나오게 되는 행렬입니다. 곱셈에 대한 항등원 이라고 하죠:-D

       
  • The Zero Matrix(영행렬)
    모든 원소가 0으로 이루어진 행렬입니다. 덧셈시에 더하게 된 행렬은 그냥 자기 자신이 나오게 되는 거죠. 덧셈에 대한 항등원~

       
  • 행렬의 덧셈과 뺄셈
    행렬을 서로 더하거나 빼려면 크기가 같아야 합니다. 같은 열과 행에 있는 원소끼리 빼거나 더하게 되거든요. 수식으로 표현하자면 아래와 같습니다.

       
    행렬로 예를 들면 아래와 같습니다.




  • 행렬의 곱셈
    행렬은 scalar값과 곱하거나 또는 다른 행렬과 곱할 수 있습니다. scalar는 상관 없지만 다른 행렬과 곱할 때는 앞쪽에 있는 행렬의 "열"과 뒤쪽에 있는 행렬의 "행"이 같아야 곱할 수 있으며 그 결과가 되는 행렬의 크기는 앞쪽에 있는 행렬의 "행"과 뒤쪽에 있는 행렬의 "열"이 됩니다.
       
    일단 scalar와의 곱 입니다. 전체 원소에 같은 값을 곱해 주면 되는 것이죠. 아래에 그 일반식과 예시를 보시면 됩니다.

     

    행렬과 행렬간의 곱셈은 아래의 그림에서 한큐에 이해 되게끔 그려놨습니다.

       
    그럼 계산의 일반식을 볼까요?

       
    일반식 적으려고 보니 완전 빡세네요 :-D 알아보기도 힘들거 같고.. 그냥 제 식대로 적어볼게요. A와 B 행렬의 곱에서 A는 행 단위로 자르고, B는 열단위로 자릅니다. A의 행 과 곱하게 되는 B의 열, 그 자체가 결과물의 위치의 원소가 됩니다.

       
    지금 A에서 1행을 B의 모든 열에 곱하죠? 이때 결과가 되는 행렬의 1행1열의 값은? A의 1행과 B의 1열이 곱해진 값. 이 되는 겁니다.
    그럼 B의 다음 열 하고도 곱하죠? A의 1행과 B의 2열. 즉, 결과 행렬의 1행2열의 값. 이런식 으로 각 원소를 서로서로 곱하고 더해주면 됩니다.
       
    행렬간의 곱셈은 교환법칙이 성립하지 않습니다. 즉 AxB와 BxA는 전혀 다른 식이라는 거죠 :-D

       
이런 이론을 바탕으로 행렬을 코딩 하는게 뒤에 나오는데, 여긴 이론 관련 내용이니까 이 부분은 프로그래밍 분류에 포스팅 한 것을 참조 하세요 :-D
   
3x3 행렬 코딩
   
참조 : OPENGL GAME PROGRAMMING(Foreword by Mark J.Kilgard)

'Theory > Mathmatics' 카테고리의 다른 글

변환(Transformation)  (0) 2011.12.15
수학에서의 Scalar와 Vector  (0) 2011.12.13