C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[6803] Re:어떤 행렬 라이브러리를 쓰셨나요?
김백일.cedar [cedar] 2680 읽음    2003-02-13 19:20
김상구.패패루 님이 쓰신 글 :
: 아시는 분은 아시겠지만 제가 요즘 2.5D CAD모델러를 만들고 있습니다.
: 뭐 모델러라고 부르기엔 우습긴 하지만 ^^
:
: 아무튼, 실제 적용은 2D에만 적용되겠지만 엔진부분은 현재 3D로 만들고 있는데요..
: CAD모델러에서 사용되는 호모지니어스좌표계(homogeneous coordination)에서는 1x4 벡터와 4x4 메트릭스간의 연산이 아주 빈번합니다. 뷰어의 경우 지오메트리가 이미 고정되어 있기 때문에 별로 신경 안쓰고 OpenGL이나 DirectX에서 제공하는 기초적인 기능으로도 충분하지만 모델러는 좀 다르죠.
: ViewMatrix에 대한 역행렬을 구해야 하는 일도 빈번하고.. 선형대수 문제도 많이 풀어야 하기 땜시.. Matrix클래스가 필수입니다.
:
: 문제는.. 전부터 써 오던 템플릿으로 구성된 좋은 Matrix클래스가 있는데.. 이넘은 범용이기 때문에 자체적으로 Row와 Col의 갯수를 따로 저장을 합니다. 기본 8byte를 먹고 들어가고 계산 속도를 높이기 위해 Row*Col의 값도 가지고 있죠. 아무튼, 기본 사이즈가 16byte입니다.
: 당연히 Col크기를 1로 고정하면 벡터로 사용할 수 있으니까 좋긴 한데.. 역시 범용은 범용이죠.
: 대용량의 Matrix연산에 초점이 맞춰져 있는 이 클래스를 바로 모델러에서 쓰기는 어렵더군요.
:
: 기왕 만드는거 3D모델러에서도 쓸 수 있고 다른 영역에도 쉽게 적용되고.. 데이터 크기도 적게 먹고.. 그런 클래스를 만들려고 오랫동안 고민했지만.. 잘 안되는군요.
: 기존의 여러 자료들을 봐도 말 그대로 수치계산용 클래스들이라서 바로 쓰기엔 역부족입니다. 특히 OpenGL이나 DirectX와 함께 쓰려고 하면 데이터 복사 과정이 중간에 꼭 개입되는 그런 구조가 많더군요.

그래픽스 분야가 제 전공하고는 거리가 멀기는 하지만,
행렬과 선형 대수에 대해서는 관심을 두어 본적이 있습니다.
그동안 어떤 행렬 라이브러리를 쓰셨는 지가 궁금하네요.

행렬 연산과 같은 선형 대수용 라이브러리를 찾아보니 상당히 여러가지가 있더군요.

속도가 빠르기로는, 수치 연산 전용 언어나 다름없는 포트란의 속도에 필적하는 Blitz++ 라이브러리가 있지만( http://www.oonumerics.org/blitz/ ), 이건 template metaprogramming을 하드하게 사용하는 방식이라 ANSI C++ 호환성이 매우 높아야 한다는 제약이 있어서, VC++와 BC++를 지원하지 않는 문제점이 있더군요.

그 외에도 위 사이트 링크( http://www.oonumerics.org/oon/ )를 참고하면 꽤 여러가지 라이브러리를 볼 수 있는데, MTL(The Matrix Template Library, http://www.osl.iu.edu/research/mtl/ )과
uBLAS 등을 많이 쓴다더군요.
그 중에서도 uBLAS는 최근에 Boost 라이브러리에 포함되었으므로, 사용하기가 더 편할 겁니다.
( http://boost.org/libs/numeric/ublas/doc/index.htm , http://www.genesys-e.org/ublas/ )

: virtual을 사용하면 구조적으로는 가능하다는 결론이 내려지긴 했지만 일단 virtual function을 쓰면 클래스의 크기가 4byte 증가하기 때문에 벡터나 Matrix를 Array로 취급하여 다루는 방식에서 심각한 문제가 있을 뿐만 아니라 오버헤드도 발생하니까요.

단지 속도 빠르고 쓰기가 간편한 다차원 배열 라이브러리를 원하신다면,
역시 Boost 라이브러리의 최신 버전에 추가된 MultiArray 를 써보실 것을 권합니다.
http://boost.org/libs/multi_array/doc/index.html
행렬 연산과 같은 기능을 제외하고, 오직 "Matrix를 Array로 취급하여 다루는 방식",
즉, "다차원 배열 STL 컨테이너"의 구현에만 충실한 라이브러리지요.
이 라이브러리를 기본으로 해서 필요한 연산을 추가해서 사용해보시는 것도 좋을 듯합니다.

: 그렇다고 클래스에 자기 크기를 저장하도록 설계 하자니 모델러에서 쓰는 행렬이라 해 봐야 전부 4*1 아니면 4*4, 끽해야 1*4 정도인데 정점벡터에 전부 자기 크기 달고 다니게 되고.. vertex수가 몇십만이 될지 모르는데 엄청난 낭비.. 그만큼의 속도 저하가 불보듯 뻔하네요.
:
: 최후의 방법은 4*1벡터 클래스 하나 만들고 그 클래스와 호환되는 4*4메트릭스 클래스 하나 만들고
: 앞의 두가지 클래스와 모두 호환되는 범용 벡터 클래스와 범용 메트릭스 클래스를 만드는 것..
: 완전 삽질이고 '객체지향'을 꺼꾸로 적용하는 골때리는 방법이긴 하지만 범용 클래스들은 어차피 이번 프로젝트엔 안쓸거니까요.
:
: 어떻게 이 삽질을 피해볼까 별 잔머리는 다 굴려봤지만 오늘 최종 결론을 내렸습니다.
: 쓸데없는 저항이다.. 범용은 포기하고 전용으로 만들자. 대신 기존 범용 메트릭스 클래스와 호환되도록 캐스팅 연산자를 제공하는걸로 하기로.. 그렇게 제 자신과 합의를 봤습니다.
:
: 허탈합니다. ㅠ ㅠ
:
:
: 아참.. 수야님이 자꾸 에바 어디까지 만들었냐구 물어보는데..
: 왼쪽 다리만 만들면 완성인데 요즘 방치해 두고 있습니다.
: 다리를 다 만들고 나서 어깨 머리 팔 몸통 다리를 연결하는 최종조립을 할 예정인데 사진찍기도 귀찮고.. 방바닥에 굴려놓고 있다보니 가끔 발로 차고 해서 약간 수선도 해야돼요.
: 참고로 친구가 전에 한 번 놀러와서 보고는 '징그럽다'고 하더군요. 무슨 로보트가 사람같이 생겼냐면서.. ㅋㅋ
:

+ -

관련 글 리스트
6802 범용이냐.. 전용이냐.. 그것이 문제로다.. 김상구.패패루 1435 2003/02/13
6803     Re:어떤 행렬 라이브러리를 쓰셨나요? 김백일.cedar 2680 2003/02/13
6805         Re:Re: 예전에 구입했던 책에 딸려있던 클래스였어요 김상구.패패루 1384 2003/02/13
6807             Re:Re:Re: 예전에 구입했던 책에 딸려있던 클래스였어요 김백일.cedar 1334 2003/02/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.