김상구.패패루 님이 쓰신 글 :
: 일단, 백일님의 그 풍부한 정보에 항상 감사드립니다.
: 오늘도 사실 백일님이 좋은 정보를 주실 줄 알고 글을 썼습니다.
:
: 제가 지금까지 쓰던건 예전에 구입했던 C++ Power Technic이라는 책에 포함된 라이브러리인데요.. 그럭저럭 꽤 쓸만합니다.
:
: MTL은 봤었는데.. 그건 전형적인 templete으로 구성된 stl류의 라이브러리죠?
: 저도 평상시에 stl의 vector등은 자주 쓰지만 이번 프로젝트에 사용하기는 어렵다는 결론이었습니다. 제가 지금 원하는 것은 4x1 벡터의 경우 x, y, z, w 네개의 맴버만을 가지고 있어서 클래스를 통째로 배열화 할 경우 바로 메트릭스로 전환되는 식의 접근방식을 원하는데 MTL은 일단 이런 방식은 안되는 분위기 입니다.
MTL 사이트에 있는 다큐먼트에 나와 있는 예제를 보니,
MTL의 사용법은 일단 보통의 C 배열을 먼저 정의하고,
매트릭스 클래스의 생성자에 이 배열의 주소를 넘기는 방식이더군요.
그러니까 3x3 행렬의 경우의 예제는 다음과 같습니다.
(출처:
http://www.osl.iu.edu/research/mtl/reference/html/dense.html )
typedef matrix< double,
rectangle<>,
dense<external>,
column_major>::type Matrix;
const Matrix::size_type N = 3;
Matrix::size_type large;
double dA[] = { 1, 3, 2, 1.5, 2.5, 3.5, 4.5, 9.5, 5.5 };
Matrix A(dA, N, N);
// Find the largest element in the first column.
large = max_index(A[0]);
// Swap the first row with the row containing the largest
// element in the first column.
swap( rows(A)[0] , rows(A)[large]);
이런 방식이 님이 원하시는 방법에 맞지 않는다는 의미인가요?
(하긴 저도 그렇게 맘에 드는 방식은 아니지만요.)
: 게다가 호모지니어스 좌표계에서는 일반 벡터연산과 좀 다른 규칙이 부여됩니다.
:
: 예를 들어
: [x1, y1, z1, 1]T + [x2, y2, z2, 1]T = [x1+x2, y1+y2, z1+z2, 1]T
:
: 이런식의 연산이 필요하거든요.
: 마지막 w 값은 항상 1로 유지가 되어야 하는.. 좀 특이합니다. 일반적인 벡터 연산을 하면 마지막 값이 2가 되죠? 이런 사소한 문제서부터..
: 수치계산에서 Matrix연산은 주로 Matrix의 수가 많은게 아니라 Matrix의 수는 상대적으로 소수, 대신 row/col의 크기가 어마어마하게 큰 메트릭스의 각종 연산을 얼마나 효율적으로 수행하는가..에 초점이 맞춰져 있죠. 그래픽스쪽에선 약간 초점이 다른 것이 주로 고속의 벡터 내적/외적 연산, 행렬/벡터간의 Product연산.. 4x4메트릭스에 대한 역행렬.. 정도가 많이 쓰입니다.
:
: 만일 파라메트릭 모델링을 지원하려 한다면 그때는 일반 수치연산에서 사용하는 대용량의 메트릭스가 필요하게 되죠. 파라메트릭 모델링에 최적설계 알고리즘을 적용하는 경우도 있기 때문에 이때는 희소행렬도 요긴하게 쓰일 수 있겠네요.
:
: 알려주신 자료들을 아직 다 검토해 보지는 못했으나 몇개 확인해 본 것과 설명을 기초로 판단하건데.. 주로 수치연산쪽에 적합하지 않나.. 싶네요.
:
: OpenGL이나 DirectX의 경우 각종 vertex정보나 matrix정보들은 일반배열을 통해 서로 교환되기 때문에 기존 C 스타일의 프로그래밍에서는 임의의 배열에 대한 행렬연산을 수행할 수 있는 함수셋을 구성하는 것이 일반적이었던 것 같습니다. 뭐, 각종 책들을 봐도 비슷하게 해결하고 있죠.
: 예전에는 잘 모를때는 저도 이런 식으로 주로 만들었는데.. 이렇게 만들면 정말 나중에 감당이 안됩니다. 거의 짜장면의 극을 달리게 되는..
:
: 아무튼.. 좋은 정보 주셔서 다시한번 감사드리구요, 그 사이트 가 보니까 다른 여러가지 라이브러리를 많이 제공하는 것 같군요. 찬찬히 좀 살펴봐야겠습니다. 딱 맞는 라이브러리까지는 아니더라도 좋은 아이디어를 좀 얻을 수 있으면 좋겠네요.
일단, 님의 경우처럼 일반적인 행렬 연산이 아니라, 별도로 연산을 정의해야 하는 경우라면,
boost::multi_array 가 제일 알맞을 것 같네요.