행렬에 대해 조금이라도 공부를 해봤다면 2x2 정방행렬에 대한 행렬식은 기본적으로 알고있을것이다.
3x3 이상의 크기를 가지는 정방행렬에 대한 행렬식을 멋드러지게 설명하려면 cofactor(여인수)에 대한 이해가 필요하다.
i행j열 element의 cofactor는 i행, j열이 제거된 행렬의 행렬식과 특정한 부호로 결정되며 다음과 같이 일반화 할 수 있다.
여기서 M<i,j>는 행렬 M에서 i행,j열을 제거한 행렬을 의미하며 det(M)은 M의 행렬식을 의미한다. 이로부터 nxn 정방행렬 M에 대한 행렬식 det(M)은,
위와같이 일반화할 수 있다. 즉 구하기 편해보이는 어느 열 혹은 행을 정하고 해당 열 혹은 행에 속하는 엘리먼트들에 대한 cofactor와 엘리먼트의 곱들의 합이라고 쉽게 말할 수 있다.(더 헷갈리나...)
쉽게 구한다는 의미는 0이 많이들어간 열 혹은 행을 골라 행렬식을 전개하면 된다. 이렇게 할 경우 0의 값을 가지는 엘리먼트의 수 만큼 cofactor를 구하지 않아도 되므로 굉장한 연산단축을 할 수 있다. 하지만 사람눈과 달리 코드로 0이 많은 열 혹은 행을 찾는다는것은 또다른 연산이 발생한다는 것을 의미하고, 정말 큰 행렬을 계산하는것이 아니라면 배꼽이 커지는 샘이므로 대체로 생략하고 정해진 한 행 혹은 열에대해 행렬식을 구한다.
아래는 행렬식을 구하는 C 매크로이다. 아무래도 많이 쓰인다면 캐시히트율을 높이기 위해 함수로 작성하는게 좋겠지만, 함수 인자가 너무 많아서 타입까지 다 써주다보니 길어지는게 보기싫어 매크로로 작성하였다.
#define det2x2( a,b, \
c,d ) (a*d - b*c)
#define det3x3( a,b,c, \
d,e,f,\
g,h,i ) (a*det2x2(e,f,h,i) -b*det2x2(d,f,g,i) +c*det2x2(d,e,g,h))
#define det4x4( a,b,c,d, \
e,f,g,h, \
i,j,k,l, \
m,n,o,p ) (a*det3x3(f,g,h,j,k,l,n,o,p) -b*det3x3(e,g,h,i,k,l,m,o,p) +c*det3x3(e,f,h,i,j,l,m,n,p) -d*det3x3(e,f,g,i,j,k,m,n,o))
'Coding Note' 카테고리의 다른 글
Tetrahedron circumsphere from 4 points (0) | 2013.10.28 |
---|---|
A point within the tetrahedron (0) | 2013.10.23 |
[C++] virtual inheritance (0) | 2013.06.29 |
[Design pattern] 디자인 패턴이란 (6) | 2013.03.28 |
[Design pattern] Visitor (0) | 2013.03.27 |