IT story

가장 널리 사용되는 C ++ 벡터 / 행렬 수학 / 선형 대수 라이브러리는 무엇이고 비용과 이점은 무엇입니까?

hot-time 2020. 4. 15. 12:34
반응형

가장 널리 사용되는 C ++ 벡터 / 행렬 수학 / 선형 대수 라이브러리는 무엇이고 비용과 이점은 무엇입니까? [닫은]


많은 프로젝트가 행렬 수학을 수행해야 할 필요성이 천천히 발생하고 일부 벡터 클래스를 먼저 구축하고 절반에 의존하는 사용자 정의 선형 대수 라이브러리를 구축 할 때까지 기능을 천천히 추가하는 함정에 빠지게됩니다.

접선 적으로 관련된 라이브러리 (예 : OpenCV, OpenSceneGraph)에 의존하지 않는 동안 피하고 싶습니다.

일반적으로 사용되는 행렬 수학 / 선형 대수 라이브러리는 무엇이며 왜 서로를 사용하기로 결정합니까? 어떤 이유로 사용하지 말아야 할 것이 있습니까? 특히 기하학적 / 시간 컨텍스트 * (2,3,4 Dim) *에서 이것을 사용하고 있지만 앞으로 더 높은 차원의 데이터를 사용할 수 있습니다.

API, 속도, 메모리 사용, 너비 / 완전성, 좁음 / 특성, 확장 성 및 / 또는 성숙도 / 안정성 중 어느 것과 관련하여 차이점을 찾고 있습니다.

최신 정보

나는 Eigen3을 사용하여 결국 매우 기뻤습니다.


이를 위해 Generic Graphics Toolkit정착 한 프로젝트가 꽤 있습니다 . GMTL은 훌륭합니다. 아주 작고 기능적이며 매우 신뢰할 수있을 정도로 널리 사용되었습니다. OpenSG, VRJuggler 및 기타 프로젝트는 모두 수동 롤터 / 매트릭스 수학 대신 이것을 사용하도록 전환했습니다.

템플릿을 통해 모든 작업을 수행하므로 매우 유연하고 빠릅니다.


편집하다:

의견 토론과 편집 후에 특정 구현의 이점과 단점, 상황에 따라 다른 것을 선택하는 이유에 대해 더 많은 정보를 버리겠다고 생각했습니다.

GMTL -

이점 : 그래픽 엔진을 위해 특별히 설계된 간단한 API입니다. 다른 패키지에없는 렌더링 (예 : 평면, AABB, 다중 보간이 포함 된 쿼터니언 등)에 적합한 많은 기본 유형이 포함됩니다. 매우 낮은 메모리 오버 헤드, 매우 빠르고 사용하기 쉽습니다.

단점 : API는 특히 렌더링 및 그래픽에 중점을 둡니다. 범용 (NxM) 매트릭스, 매트릭스 분해 및 해석 등은 포함되지 않습니다. 이들은 기존의 그래픽 / 지오메트리 응용 프로그램의 영역을 벗어나기 때문입니다.

아이겐 -

이점 : 사용하기 쉬운 Clean API . 쿼터니언 및 기하 변환 기능이 있는 형상 모듈포함되어 있습니다 . 메모리 오버 헤드가 적습니다. 큰 NxN 행렬 및 기타 범용 수학 루틴을 완벽 하게 수행 합니다.

단점 : 원하는 것보다 약간 더 큰 범위 일 수 있습니다 (?). GMTL과 비교할 때 기하학적 / 렌더링 특정 루틴이 줄어 듭니다 (예 : 오일러 각도 정의 등).

IMSL -

장점 : 매우 완벽한 숫자 라이브러리. 매우 빠릅니다 (아마도 가장 빠른 솔버). 지금까지 가장 크고 가장 완벽한 수학적 API. 상업적으로 지원되고 성숙하며 안정적입니다.

단점 : 비용-저렴한 것은 아닙니다. 기하 형 / 렌더링 관련 메서드는 거의 없으므로 선형 대수 클래스 위에 롤링해야합니다.

NT2 -

장점 : MATLAB에 익숙한 경우 더 친숙한 구문을 제공합니다. 대형 행렬 등에 대한 전체 분해 및 해결 기능을 제공합니다.

단점 : 렌더링 중심이 아닌 수학. 아마도 아이겐만큼 성능이 떨어질 것입니다.

LAPACK -

장점 : 매우 안정적이고 검증 된 알고리즘. 오랫동안 주변에 있었다. 완전한 행렬 해결 등 모호한 수학을위한 많은 옵션.

단점 : 경우에 따라 성능이 좋지 않습니다. 홀수 API를 사용하여 포트란에서 이식되었습니다.

개인적으로, 그것은 하나의 질문으로 귀결됩니다-어떻게 이것을 사용할 계획입니까? 렌더링과 그래픽에만 중점을 둔 경우 Generic Graphics Toolkit 이 좋습니다. 성능이 우수하고 자체적으로 구현하지 않고도 유용한 유용한 렌더링 작업을 즉시 지원하기 때문입니다. 범용 행렬 해석 (즉, 큰 행렬의 SVD 또는 LU 분해)이 필요한 경우 Eigen 을 처리하고 일부 기하학적 연산을 제공하며 큰 행렬 솔루션으로 성능이 뛰어납니다. 매트릭스 / 벡터 위에 자신 만의 그래픽 / 기하학적 연산을 더 작성해야 할 수도 있지만 끔찍한 것은 아닙니다.


그래서 저는 매우 비판적인 사람이고, 도서관에 투자 할 생각이라면, 내가 무엇을 받고 있는지 더 잘 알고있을 것입니다. 면밀히 조사 할 때 아첨에 대해 비판하고 밝게하는 것이 낫다고 생각합니다. 무엇이 잘못되었는지는 미래에 옳은 것보다 더 많은 영향을 미칩니다. 그래서 여기에 약간 도움이 될만한 답변을 제공하기 위해 조금 더 배를 타서이 길을 여행하는 다른 사람들을 도울 수 있기를 바랍니다. 이것은 내가이 라이브러리로 수행 한 작은 검토 / 테스트를 기반으로한다는 것을 명심하십시오. 오, 나는 리드의 긍정적 인 설명을 훔쳤다.

나는 Eigen2의 불안전성이 너무 큰 단점으로 인해 독특함에도 불구하고 GMTL과 함께 갔다고 언급 할 것입니다. 그러나 최근 Eigen2의 다음 릴리스에는 정렬 코드를 차단하고 안전하게 만드는 정의가 포함되어 있음을 알게되었습니다. 그래서 전환 할 수 있습니다.

업데이트 : Eigen3으로 전환했습니다. 특유성에도 불구하고 그 범위와 우아함을 무시하기가 어렵고 안전하지 않은 최적화는 정의로 끌 수 있습니다.

아이겐 2 / 아이겐 3

장점 : LGPL MPL2, 깨끗하고 잘 설계된 API, 사용하기 쉽습니다. 활기찬 커뮤니티와 잘 유지되는 것 같습니다. 메모리 오버 헤드가 적습니다. 고성능. 일반적인 선형 대수를 위해 만들어졌지만 훌륭한 기하 기능도 사용할 수 있습니다. 모든 헤더 lib, 링크 필요 없음

특이성 / 하향 : ( 현재 개발 지점 Eigen3 에서 사용 가능한 일부 정의에 의해 일부 / 모두 피할 수 있음 )

  • 안전하지 않은 성능 최적화는 신중하게 규칙을 따라야합니다. 규칙을 따르지 않으면 충돌이 발생합니다.
    • 당신은 단순히 가치를 안전하게 전달할 수 없습니다
    • 고유 유형을 멤버로 사용하려면 특별한 할당 자 사용자 정의가 필요합니다 (또는 충돌)
    • stl 컨테이너 유형 및 다른 템플릿과 함께 사용하면 특별한 할당 사용자 정의가 필요합니다 (또는 충돌이 발생합니다)
    • 특정 컴파일러는 함수 호출 (GCC 창)에서 충돌을 방지하기 위해 특별한주의가 필요합니다

GMTL

이점 : 그래픽 엔진을 위해 특별히 설계된 LGPL, 상당히 간단한 API입니다. 다른 패키지에없는 렌더링 (예 : 평면, AABB, 다중 보간이 포함 된 쿼터니언 등)에 적합한 많은 기본 유형이 포함됩니다. 매우 낮은 메모리 오버 헤드, 매우 빠르고 사용하기 쉽습니다. 모든 헤더 기반이며 링크가 필요하지 않습니다.

관용구 / 단점 :

  • 기발한 API
    • 다른 라이브러리의 myVec.x ()는 myVec [0]을 통해서만 사용할 수 있습니다 (가독성 문제).
      • 점의 배열 또는 stl :: vector로 인해 pointsList [0] [0]과 같은 작업을 수행하여 첫 번째 점의 x 구성 요소에 액세스 할 수 있습니다.
    • 컴파일러가 불필요한 임시 온도를 제거 할 때 최적화에 대한 순진한 시도에서 cross (vec, vec)를 제거하고 makeCross (vec, vec, vec)로 대체했습니다.
    • 정규 수학 연산은 일부 최적화 기능을 종료하지 않는 한 정규 유형을 반환 vec1 - vec2하지 않습니다 . 예 : 법선 벡터를 반환하지 않으므로 작동 length( vecA - vecB )하더라도 실패 vecC = vecA - vecB합니다. 당신은 다음과 같이 포장해야합니다 :length( Vec( vecA - vecB ) )
    • 벡터에 대한 연산은 멤버가 아닌 외부 함수에 의해 제공됩니다. 공통 심볼 이름이 충돌 할 수 있으므로 어디에서나 범위 해상도를 사용해야 할 수도 있습니다.
    • 당신이해야
        length( makeCross( vecA, vecB ) )
      하거나
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      그렇지 않으면 시도 할 수있는 곳
        vecA.cross( vecB ).length()
  • 잘 관리되지 않은
    • 여전히 "베타"로 주장
    • 정상적인 기능을 사용하는 데 필요한 헤더와 같은 기본 정보가없는 문서
      • Vec.h에는 Vector에 대한 연산이없고 VecOps.h에는 일부가 있고 다른 것에는 Generate.h에 있습니다. VecOps.h의 cross (vec &, vec &, vec &), Generate.h의 [make] cross (vec &, vec &)
  • 미성숙 / 불안정한 API; 여전히 변화하고 있습니다.
    • 예를 들어 "cross"가 "VecOps.h"에서 "Generate.h"로 이동 한 다음 이름이 "makeCross"로 변경되었습니다. 더 이상 존재하지 않는 이전 버전의 함수를 계속 참조하므로 문서 예제가 실패합니다.

NT2

웹 페이지의 프랙탈 이미지 헤더가 콘텐츠보다 더 관심이있는 것처럼 보이기 때문에 말할 수 없습니다. 심각한 소프트웨어 프로젝트보다는 학술 프로젝트처럼 보입니다.

2 년 전의 최신 릴리스.

아마도 어딘가에 프랑스어로 된 것이 있지만 아마도 영어로 된 문서는 없습니다.

캔 트는 프로젝트 주변에서 커뮤니티의 흔적을 찾습니다.

LAPACK & BLAS

장점 : 오래되고 성숙한.

단점 :

  • 정말 엉뚱한 API를 가진 공룡으로 오래된

가치있는 것을 위해, 나는 Eigen과 Armadillo를 모두 시도했습니다. 아래는 간단한 평가입니다.

고유 장점 : 1. 완전 독립형 – 외부 BLAS 또는 LAPACK에 의존하지 않습니다. 적절한 문서. 3. 테스트에 넣지 않았지만, 빠른 속도로 제공됩니다.

단점 : QR 알고리즘은 위쪽 삼각형에 R 행렬이 포함 된 단일 행렬 만 반환합니다. 나머지 행렬의 출처를 모르고 Q 행렬에 액세스 할 수 없습니다.

Armadillo 장점 : 1. 광범위한 분해 및 기타 기능 (QR 포함). 2. 상당히 빠르지 만 (표현 템플릿 사용) 다시 한 번 높은 차원으로 밀지 않았습니다.

단점 : 1. 매트릭스 분해를 위해 외부 BLAS 및 / 또는 LAPACK에 의존합니다. 2. 설명서에 IMHO가 부족합니다 (#define 문을 변경하는 것 이외의 사양 wrt LAPACK 포함).

자체 포함되어 있고 사용하기 쉬운 오픈 소스 라이브러리를 사용할 수 있다면 좋을 것입니다. 나는 10 년 동안이 같은 문제에 부딪 쳤고 실망합니다. 언젠가는 C에 GSL을 사용하고 그 주위에 C ++ 래퍼를 작성했지만 현대식 C ++, 특히 표현식 템플릿의 장점을 사용하여 21 세기에 C를 망칠 필요는 없습니다. 그냥 내 tuppencehapenny입니다.


인텔 프로세서에서 고성능 매트릭스 / 선형 대수 / 최적화를 찾고 있다면 인텔의 MKL 라이브러리를 살펴 보겠습니다.

MKL은 빠른 런타임 성능을 위해 세 심하게 최적화되어 있으며, 대부분은 매우 성숙한 BLAS / LAPACK 포트란 표준을 기반으로합니다. 또한 사용 가능한 코어 수에 따라 성능이 확장됩니다. 사용 가능한 코어를 통한 핸즈프리 확장 성은 컴퓨팅의 미래이며 새로운 프로젝트에는 멀티 코어 프로세서를 지원하지 않는 수학 라이브러리를 사용하지 않을 것입니다.

간단히 말해 다음과 같습니다.

  1. 기본 벡터-벡터, 벡터-행렬 및 행렬-행렬 연산
  2. 행렬 분해 (LU decomp, hermitian, sparse)
  3. 최소 제곱 피팅 및 고유 값 문제
  4. 스파 스 선형 시스템 솔버
  5. 비선형 최소 제곱 솔버 (신뢰 영역)
  6. FFT 및 컨볼 루션과 같은 플러스 신호 처리 루틴
  7. 매우 빠른 난수 생성기 (메르 센 트위스트)
  8. 훨씬 더 .... 참조 : 링크 텍스트

단점은 필요한 루틴에 따라 MKL API가 상당히 복잡 할 수 있다는 것입니다. 또한 고성능 이미지 처리 작업을 목표로하지만 IPP (Integrated Performance Primitives) 라이브러리를 살펴볼 수도 있습니다.

CenterSpace 소프트웨어, .NET 수학 라이브러리, centerspace.net


나는 EigenNT2 에 대해 좋은 소식을 들었지만 개인적으로 사용하지는 않았습니다. Boost.UBLAS 도 있습니다 .이 치아가 조금 길어지고 있다고 생각합니다. NT2의 개발자들은 Boost에 들어 가려는 의도로 다음 버전을 구축하고 있습니다.

내 린 alg. 4x4 매트릭스를 넘어 설 필요가 없으므로 고급 기능에 대해서는 언급 할 수 없습니다. 방금 몇 가지 옵션을 지적하고 있습니다.


저는이 주제를 처음 했기 때문에 많은 것을 말할 수 없지만 BLAS 는 과학 컴퓨팅의 표준입니다. BLAS는 실제로 많은 구현이있는 API 표준입니다. 어떤 구현이 가장 인기가 있는지 또는 왜 확실하지 않습니다.

일반적인 선형 대수 연산 (시스템 해결, 최소 제곱 회귀, 분해 등)을 수행하려면 LAPACK을 살펴보십시오 .


무엇에 대한 GLM ?

GLSL (OpenGL Shading Language) 사양을 기반으로하며 MIT 라이센스에 따라 릴리스됩니다. 그래픽 프로그래머를 겨냥한 것


Eigen에 대한 투표를 추가하겠습니다. 다른 라이브러리에서이 코드로 많은 코드 (3D 지오메트리, 선형 대수 및 미분 방정식)를 포팅하여 거의 모든 경우에 성능과 코드 가독성을 향상 시켰습니다.

언급되지 않은 한 가지 장점 : Eigen과 함께 SSE를 사용하는 것이 매우 쉬워 2D-3D 작업의 성능을 크게 향상시킵니다 (모든 것이 128 비트로 채워질 수 있음).


좋아, 나는 당신이 찾고있는 것을 알고 있다고 생각합니다. Reed Copsey가 제안한 것처럼 GGT는 꽤 좋은 솔루션 인 것으로 보입니다.

개인적으로 우리는 합리적 NURBS와 베 지어의 많은 합리적 포인트를 다루기 때문에 우리 자신의 작은 라이브러리를 굴 렸습니다.

대부분의 3D 그래픽 라이브러리는 프로젝션 수학에 근거가없는 프로젝션 포인트를 사용하여 계산을 수행하는 것으로 나타났습니다. 우리는 Grassmann 포인트를 사용하여 이론적 인 토대가 확고 해지고 포인트 유형의 수가 줄었습니다. Grassmann 포인트는 기본적으로 사람들이 현재 사용하는 것과 동일한 계산이며 강력한 이론의 이점이 있습니다. 가장 중요한 것은 우리의 생각이 더 명확 해 지므로 버그가 줄어든다는 것입니다. Ron Goldman은 " 컴퓨터 그래픽 의 대수 및 기하 기초" 라는 컴퓨터 그래픽에서 Grassmann 포인트에 관한 논문을 썼습니다 .

귀하의 질문과 직접 ​​관련이 없지만 흥미로운 내용입니다.


플랜지

http://flens.sf.net

또한 많은 LAPACK 기능을 구현합니다.


나는이 라이브러리가 매우 간단하고 기능적이라는 것을 알았습니다 ( http://kirillsprograms.com/top_Vectors.php ). 이들은 C ++ 템플릿을 통해 구현 된 베어 본 벡터입니다. 멋진 물건은 없습니다-벡터로해야 할 일 (더하기, 빼기, 도트 등).

참고 : https://stackoverflow.com/questions/1380371/what-are-the-most-wide-used-c-vector-matrix-math-linear-algebra-libraries-a

반응형