Các thư viện đại số tuyến tính / ma trận / toán học C ++ được sử dụng rộng rãi nhất là gì, và sự đánh đổi chi phí và lợi ích của chúng là gì? [đóng cửa]


242

Dường như nhiều dự án dần dần xuất hiện nhu cầu làm toán ma trận, và rơi vào cái bẫy của việc xây dựng một số lớp vectơ đầu tiên và từ từ thêm chức năng cho đến khi chúng bị bắt xây dựng một thư viện đại số tuyến tính tùy chỉnh một nửa, và tùy thuộc vào nó.

Tôi muốn tránh điều đó trong khi không xây dựng sự phụ thuộc vào một số thư viện liên quan tiếp tuyến (ví dụ OpenCV, OpenSceneGraph).

Các thư viện toán học / đại số tuyến tính thường được sử dụng là gì và tại sao lại quyết định sử dụng cái này? Có bất kỳ điều gì sẽ được khuyên không nên sử dụng vì một số lý do? Tôi đặc biệt sử dụng điều này trong bối cảnh hình học / thời gian * (2,3,4 Dim) * nhưng có thể sẽ sử dụng dữ liệu chiều cao hơn trong tương lai.

Tôi đang tìm kiếm sự khác biệt liên quan đến bất kỳ: API, tốc độ, sử dụng bộ nhớ, độ rộng / đầy đủ, độ hẹp / độ đặc hiệu, khả năng mở rộng và / hoặc trưởng thành / ổn định.

Cập nhật

Tôi đã kết thúc việc sử dụng Eigen3 mà tôi vô cùng hài lòng.


2
Vì bạn đã đề cập đến OSG và OpenCV, tôi đoán bạn chỉ cần các vectơ / ma trận loại đồ họa 3D, tức là: ma trận 3x3 và 4 x 4. Tôi dựa trên câu trả lời của mình, nhưng bạn có thể muốn chỉ định chính xác cách bạn đang sử dụng điều này - bạn có cần giải ma trận không? Toán ma trận chiều cao hơn? v.v.
Reed Copsey

Hiện tại tôi chỉ đang thực hiện các công cụ dựa trên hình học 2D, nhưng theo giả thuyết đôi khi bạn cần các thao tác 3x3 trên dữ liệu 2D và không rõ liệu dữ liệu 3D có thể cần hoạt động 4 x 4 không. Chúng tôi muốn sử dụng một thư viện chung trên toàn công ty. Tôi không có ý thức tốt cho việc đánh đổi sẽ là gì. Tổng quát hơn sẽ tốt hơn, nhưng với chi phí là câu hỏi.
Catskul

1
Nếu bạn chỉ thực hiện các phép biến đổi hình học, tôi thực sự khuyên bạn nên xem GGT, như tôi đã đề cập trong câu trả lời của mình. Nó rất hoàn chỉnh cho điều đó, nhưng thực sự không có gì NHƯNG, vì vậy đó là một lựa chọn rất dễ dàng, sạch sẽ. BLAS và LAPACK là nhiều hơn cho các giải pháp ma trận phức tạp (ví dụ: ma trận 50x50, ma trận thưa thớt, v.v.) cho khoa học và toán học, không phải là các phép biến đổi hình học.
Sậy Copsey

Câu trả lời:


114

Có khá nhiều dự án đã giải quyết trên Bộ công cụ đồ họa chung cho việc này. GMTL ở đó rất hay - nó khá nhỏ, rất chức năng và được sử dụng rộng rãi đến mức rất đáng tin cậy. OpenSG, VRJuggler và các dự án khác đều đã chuyển sang sử dụng điều này thay vì toán học ma trận / ma trận cuộn bằng tay của chính họ.

Tôi đã thấy nó khá hay - nó thực hiện mọi thứ thông qua các mẫu, vì vậy nó rất linh hoạt và rất nhanh.


Biên tập:

Sau khi thảo luận về các bình luận và chỉnh sửa, tôi nghĩ rằng tôi sẽ cung cấp thêm một số thông tin về lợi ích và nhược điểm của việc triển khai cụ thể và lý do tại sao bạn có thể chọn cái khác, đưa ra tình huống của bạn.

GMTL -

Lợi ích: API đơn giản, được thiết kế đặc biệt cho các công cụ đồ họa. Bao gồm nhiều loại nguyên thủy hướng đến kết xuất (như mặt phẳng, AABB, quatenrions với nhiều phép nội suy, v.v.) không có trong bất kỳ gói nào khác. Chi phí bộ nhớ rất thấp, khá nhanh, dễ sử dụng.

Nhược điểm: API rất tập trung đặc biệt vào kết xuất và đồ họa. Không bao gồm ma trận mục đích chung (NxM), phân rã và giải ma trận, v.v., vì chúng nằm ngoài lĩnh vực của các ứng dụng đồ họa / hình học truyền thống.

Bản địa -

Lợi ích: API sạch , khá dễ sử dụng. Bao gồm một mô-đun Hình học với các bậc bốn và biến đổi hình học. Bộ nhớ thấp. Giải quyết đầy đủ, hiệu quả cao các ma trận NxN lớn và các thói quen toán học có mục đích chung khác.

Nhược điểm: Có thể là một phạm vi lớn hơn một chút so với bạn muốn (?). Ít thói quen hình học / kết xuất cụ thể hơn khi so sánh với GMTL (nghĩa là: Định nghĩa góc Euler, v.v.).

IMSL -

Lợi ích: Thư viện số rất đầy đủ. Rất, rất nhanh (được cho là người giải nhanh nhất). Cho đến nay, API toán học lớn nhất, đầy đủ nhất. Hỗ trợ thương mại, trưởng thành và ổn định.

Nhược điểm: Chi phí - không tốn kém. Rất ít phương pháp hình học / kết xuất cụ thể, vì vậy bạn sẽ cần phải tự mình cuộn lên trên các lớp đại số tuyến tính của chúng.

NT2 -

Lợi ích: Cung cấp cú pháp quen thuộc hơn nếu bạn đã sử dụng MATLAB. Cung cấp sự phân tách và giải quyết đầy đủ cho các ma trận lớn, v.v.

Nhược điểm: Toán học, không tập trung kết xuất. Có lẽ không phải là biểu diễn như Eigen.

LAPACK -

Lợi ích: Rất ổn định, thuật toán đã được chứng minh. Đã được khoảng một thời gian dài. Hoàn thành giải ma trận, vv Nhiều lựa chọn cho toán học tối nghĩa.

Nhược điểm: Không hiệu quả cao trong một số trường hợp. Được chuyển từ Fortran, với API lẻ để sử dụng.

Cá nhân, đối với tôi, nó đi đến một câu hỏi duy nhất - bạn dự định sử dụng cái này như thế nào. Nếu bạn tập trung vào kết xuất đồ họa và đồ họa, tôi thích Bộ công cụ đồ họa chung , vì nó hoạt động tốt và hỗ trợ nhiều thao tác kết xuất hữu ích ngoài hộp mà không phải thực hiện theo cách riêng của bạn. Nếu bạn cần giải quyết ma trận mục đích chung (ví dụ: phân tách SVD hoặc LU của ma trận lớn), tôi sẽ đi với Eigen , vì nó xử lý việc đó, cung cấp một số thao tác hình học và rất hiệu quả với các giải pháp ma trận lớn. Bạn có thể cần phải viết nhiều hơn các hoạt động đồ họa / hình học của riêng bạn (trên ma trận / vectơ của chúng), nhưng điều đó không kinh khủng.


Bạn đã đánh giá các thư viện khác trước khi quyết định GMTL? So sánh hời hợt khiến tôi tin rằng Eigen được hỗ trợ tốt hơn, nhưng đó là trên cơ sở xem xét các trang web tương ứng. Bạn có biết bất kỳ lợi thế cụ thể của cái này hơn cái kia không?
Catskul

Eigen cũng hoạt động tốt. Nó không chín chắn vào thời điểm tôi thực hiện cuộc điều tra của mình, nhưng tôi tin rằng nó sẽ là một lựa chọn tốt vào thời điểm này. GMTL đã được sử dụng khá rộng rãi, và rất trưởng thành và vững chắc khi tôi quyết định sử dụng nó.
Sậy Copsey

Tôi đoán để giảm bớt câu hỏi của tôi đến mấu chốt: Bạn đã đưa ra lựa chọn của mình một cách chủ quan như "Điều này có vẻ tốt hơn" hoặc ở nơi có các tính năng cụ thể (api, tốc độ, sử dụng bộ nhớ, độ rộng, hẹp, mở rộng) tạo ra sự khác biệt. Tôi cho rằng trưởng thành nằm trong tiêu chí này, nhưng nếu trưởng thành là số liệu duy nhất, tôi tưởng tượng bạn sẽ chọn tùy chọn dựa trên BLAS hoặc LAPACK.
Catskul

Tôi đã chọn điều này sau khi thử nhiều tùy chọn và dựa trên nó: hiệu năng, tính khả dụng và thời gian chạy / biên dịch thấp. Eigen bây giờ trông tốt hơn nhiều so với lúc đó, vì vậy tôi không thể phán xét giữa họ. Tuy nhiên, tôi đã rất hài lòng với GMTL cho việc sử dụng của chúng tôi.
Sậy Copsey

Đó là một phần lý do tại sao tôi thích GMTL và sử dụng nó. Nó chỉ cảm thấy rất tự nhiên để sử dụng, và rất, rất dễ dàng để làm việc với. Nó cũng hỗ trợ tất cả mọi thứ tôi cần, trong trường hợp này, vì tôi chỉ lo lắng về việc trực tiếp xử lý chuyển đổi hình học và xoay tứ phương.
Sậy Copsey

38

Vì vậy, tôi là một người khá quan trọng và nghĩ rằng nếu tôi sẽ đầu tư vào một thư viện, tôi sẽ biết rõ hơn về những gì tôi đang làm. Tôi nghĩ tốt hơn là nên nặng lời chỉ trích và xem nhẹ những lời tâng bốc khi xem xét kỹ lưỡng; những gì sai với nó có nhiều ý nghĩa cho tương lai hơn những gì đúng. Vì vậy, tôi sẽ đi sâu vào đây một chút để cung cấp loại câu trả lời sẽ giúp tôi và tôi hy vọng sẽ giúp những người khác có thể đi theo con đường này. Hãy nhớ rằng điều này dựa trên những gì đánh giá / kiểm tra nhỏ mà tôi đã thực hiện với những lib này. Oh và tôi đã đánh cắp một số mô tả tích cực từ Reed.

Tôi sẽ đề cập đến đầu trang mà tôi đã đi với GMTL mặc dù đó là sự bình dị vì tính không an toàn của Eigen2 là một nhược điểm quá lớn. Nhưng gần đây tôi đã biết rằng bản phát hành tiếp theo của Eigen2 sẽ chứa các định nghĩa sẽ tắt mã căn chỉnh và làm cho nó an toàn. Vì vậy, tôi có thể chuyển qua.

Cập nhật : Tôi đã chuyển sang Eigen3. Mặc dù có những đặc điểm riêng, nhưng phạm vi và sự tao nhã của nó quá khó để bỏ qua và những tối ưu hóa khiến nó không an toàn có thể bị tắt bằng một định nghĩa.

Eigen2 / Eigen3

Lợi ích: LGPL MPL2, API sạch, được thiết kế tốt, khá dễ sử dụng. Có vẻ được duy trì tốt với một cộng đồng sôi động. Bộ nhớ thấp. Hiệu suất cao. Được làm cho đại số tuyến tính nói chung, nhưng chức năng hình học tốt cũng có sẵn. Tất cả lib tiêu đề, không cần liên kết.

Idiocyncracies / nhược điểm: (Một số / tất cả những điều này có thể tránh được bằng một số định nghĩa có sẵn trong nhánh phát triển hiện tại Eigen3)

  • Tối ưu hóa hiệu suất không an toàn dẫn đến cần phải tuân thủ cẩn thận các quy tắc. Không tuân thủ các quy tắc gây ra tai nạn.
    • bạn chỉ đơn giản là không thể vượt qua một cách an toàn
    • sử dụng các loại Eigen làm thành viên yêu cầu tùy chỉnh cấp phát đặc biệt (hoặc bạn gặp sự cố)
    • sử dụng với các loại thùng chứa stl và có thể các mẫu khác yêu cầu tùy chỉnh phân bổ đặc biệt (hoặc bạn sẽ gặp sự cố)
    • một số trình biên dịch nhất định cần được chăm sóc đặc biệt để ngăn sự cố trong các lệnh gọi hàm (cửa sổ GCC)

GMTL

Lợi ích: LGPL, API khá đơn giản, được thiết kế dành riêng cho các công cụ đồ họa. Bao gồm nhiều loại nguyên thủy hướng đến kết xuất (như mặt phẳng, AABB, quatenrions với nhiều phép nội suy, v.v.) không có trong bất kỳ gói nào khác. Chi phí bộ nhớ rất thấp, khá nhanh, dễ sử dụng. Tất cả dựa trên tiêu đề, không cần liên kết.

Idiocyncracies / nhược điểm:

  • API kỳ quặc
    • những gì có thể là myVec.x () trong một lib khác chỉ có sẵn thông qua myVec [0] (Vấn đề về khả năng đọc)
      • một mảng hoặc stl :: vectơ điểm có thể khiến bạn phải làm gì đó như pointsList [0] [0] để truy cập thành phần x của điểm đầu tiên
    • trong một nỗ lực ngây thơ để tối ưu hóa, đã loại bỏ chéo (vec, vec) và thay thế bằng makeCross (vec, vec, vec) khi trình biên dịch loại bỏ temps không cần thiết
    • Các phép toán thông thường không trả về các loại bình thường trừ khi bạn tắt một số tính năng tối ưu hóa, ví dụ: vec1 - vec2không trả về một vectơ bình thường nên length( vecA - vecB )không thành công mặc dù vecC = vecA - vecBhoạt động. Bạn phải gói như:length( Vec( vecA - vecB ) )
    • hoạt động trên các vectơ được cung cấp bởi các chức năng bên ngoài chứ không phải thành viên. Điều này có thể yêu cầu bạn sử dụng độ phân giải phạm vi ở mọi nơi vì tên biểu tượng phổ biến có thể va chạm
    • bạn phải làm
        length( makeCross( vecA, vecB ) )
      hoặc
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      nếu không bạn có thể thử
        vecA.cross( vecB ).length()
  • không được bảo trì tốt
    • vẫn tuyên bố là "beta"
    • tài liệu thiếu thông tin cơ bản như tiêu đề nào là cần thiết để sử dụng chức năng bình thường
      • Vec.h không chứa các hoạt động cho vectơ, VecOps.h chứa một số, những cái khác nằm trong Generate.h chẳng hạn. chéo (vec &, vec &, vec &) trong VecOps.h, [make] chéo (vec &, vec &) trong Generate.h
  • API chưa trưởng thành / không ổn định; vẫn đang thay đổi
    • Ví dụ: "chéo" đã chuyển từ "VecOps.h" sang "Generate.h", và sau đó tên được đổi thành "makeCross". Các ví dụ về tài liệu không thành công vì vẫn đề cập đến các phiên bản cũ của các chức năng không còn tồn tại.

NT2

Không thể biết vì dường như họ quan tâm nhiều hơn đến tiêu đề hình ảnh fractal của trang web của họ hơn là nội dung. Trông giống như một dự án học thuật hơn là một dự án phần mềm nghiêm túc.

Phát hành mới nhất hơn 2 năm trước.

Rõ ràng không có tài liệu bằng tiếng Anh mặc dù được cho là có một cái gì đó bằng tiếng Pháp ở đâu đó.

Không thể tìm thấy dấu vết của một cộng đồng xung quanh dự án.

LAPACK & BLAS

Lợi ích: Cũ và trưởng thành.

Nhược điểm:

  • già như khủng long với các API thực sự nhảm nhí

1
Về các xác nhận được căn chỉnh Eigen: để có được hiệu suất cao từ các hoạt động SSE (1,2,3 hoặc 4) cho các bộ dữ liệu nhỏ, bạn hoàn toàn cần dữ liệu được căn chỉnh. Các hoạt động tải / cửa hàng không được sắp xếp là chậm hơn nhiều. Quyết định giữa tải / cửa hàng được căn chỉnh hoặc không được phân bổ cũng mất thời gian. Bất kỳ việc thực hiện "mục đích chung" nào cũng sẽ có một thời gian thực sự khó khăn để làm điều đúng đắn cho mọi người, trừ khi họ tách giao diện thành các hoạt động "căn chỉnh" và "không được phân bổ" - và sau đó đơn giản lại không phải là mục đích chung chung.
Joris Timmermans

@Catskul Tôi muốn sử dụng Eigen3. Bạn có thể vui lòng mở rộng trên "các tối ưu hóa làm cho nó không an toàn có thể được tắt bằng một định nghĩa" không? Các vấn đề khác mà bạn liệt kê trong Eigen2 được chi tiết cẩn thận trong tài liệu trong Chủ đề liên quan đến các vấn đề căn chỉnh . Tôi có thể sống với những vấn đề này.
Ali

Các vấn đề về an toàn tôi đang đề cập đến tất cả các liên kết liên quan và giống nhau từ Eigen2. Nếu bạn ổn với Eigen2, bạn sẽ ổn với Eigen3.
Catskul

2
BLAS và LAPACK không thực sự là thư viện mà là thông số kỹ thuật / API. bạn có thể đã đề cập đến các triển khai ban đầu của họ bằng netlib hoặc các triển khai khác như ATLAS và OpenBLAS.
Foad

12

Để biết giá trị của nó, tôi đã thử cả Eigen và Armadillo. Dưới đây là một đánh giá ngắn gọn.

Ưu điểm của Eigen: 1. Hoàn toàn khép kín - không phụ thuộc vào BLAS hoặc LAPACK bên ngoài. 2. Tài liệu đàng hoàng. 3. Cố ý rất nhanh, mặc dù tôi chưa thử nghiệm.

Nhược điểm: Thuật toán QR chỉ trả về một ma trận đơn, với ma trận R được nhúng trong tam giác trên. Không biết phần còn lại của ma trận đến từ đâu và không có ma trận Q nào có thể được truy cập.

Ưu điểm của Armadillo: 1. Phạm vi phân hủy rộng và các chức năng khác (bao gồm cả QR). 2. Nhanh chóng hợp lý (sử dụng các mẫu biểu thức), nhưng một lần nữa, tôi thực sự đã đẩy nó lên các chiều cao.

Nhược điểm: 1. Phụ thuộc vào BLAS bên ngoài và / hoặc LAPACK cho phân tách ma trận. 2. Tài liệu thiếu IMHO (bao gồm LAPACK cụ thể, ngoài việc thay đổi câu lệnh #define).

Sẽ thật tuyệt nếu một thư viện mã nguồn mở có sẵn, khép kín và dễ sử dụng. Tôi đã gặp vấn đề tương tự trong 10 năm và nó trở nên bực bội. Tại một thời điểm, tôi đã sử dụng GSL cho C và viết các trình bao bọc C ++ xung quanh nó, nhưng với C ++ hiện đại - đặc biệt là sử dụng các lợi thế của các mẫu biểu thức - chúng ta không nên gặp rắc rối với C trong thế kỷ 21. Chỉ cần tuppencehapenny của tôi.


2
Armadillo có một cú pháp giống Matlab có chủ ý, vì vậy nó rất dễ sử dụng. Tôi không chắc ý của bạn về "tài liệu còn thiếu ... cụ thể là viết LAPACK". Tài liệu rõ ràng ghi lại tất cả các chức năng có sẵn của người dùng, cùng với các ví dụ về cách sử dụng chúng. Toàn bộ quan điểm về một thư viện trình bao bọc C ++ là trừu tượng hóa sự phức tạp và tính dài dòng của LAPACK. Bạn luôn có thể duyệt nguồn nếu bạn muốn xem cách Armadillo gọi LAPACK.
mtall

Về phân tách QR trong Eigen, bạn có nghĩa là Eigen2 hoặc Eigen3?
qed

11

Nếu bạn đang tìm kiếm ma trận / đại số tuyến tính / tối ưu hóa hiệu suất cao trên bộ xử lý Intel, tôi sẽ xem thư viện MKL của Intel.

MKL được tối ưu hóa cẩn thận cho hiệu suất thời gian chạy nhanh - phần lớn dựa trên các tiêu chuẩn fortran BLAS / LAPACK rất trưởng thành. Và hiệu suất của nó quy mô với số lượng lõi có sẵn. Khả năng mở rộng rảnh tay với các lõi khả dụng là tương lai của điện toán và tôi sẽ không sử dụng bất kỳ thư viện toán học nào cho một dự án mới không hỗ trợ bộ xử lý đa lõi.

Rất ngắn gọn, nó bao gồm:

  1. Các phép toán vectơ cơ bản, vectơ, ma trận và ma trận
  2. Yếu tố ma trận (LU decomp, hermiti, thưa thớt)
  3. Phù hợp với bình phương nhỏ nhất và các vấn đề eigenvalue
  4. Giải quyết hệ thống tuyến tính thưa thớt
  5. Bộ giải bình phương tối thiểu phi tuyến tính (vùng tin cậy)
  6. Các thói quen xử lý tín hiệu cộng như FFT và tích chập
  7. Máy phát số ngẫu nhiên rất nhanh (mersenne twist)
  8. Nhiều hơn nữa .... xem: liên kết văn bản

Một nhược điểm là API MKL có thể khá phức tạp tùy thuộc vào thói quen mà bạn cần. Bạn cũng có thể xem thư viện IPP (Nguyên tắc hiệu suất tích hợp) của họ, hướng đến các hoạt động xử lý hình ảnh hiệu suất cao, nhưng vẫn khá rộng.

Paul

Phần mềm CenterSpace, thư viện .NET Math, centrepace.net


8

Tôi đã nghe những điều hay về EigenNT2 , nhưng cá nhân tôi cũng không sử dụng. Ngoài ra còn có Boost.UBLAS , mà tôi tin rằng sẽ có một chút dài trong răng. Các nhà phát triển của NT2 đang xây dựng phiên bản tiếp theo với ý định đưa nó vào Boost, vì vậy điều đó có thể được tính cho một cái gì đó.

Lin của tôi alg các nhu cầu không vượt quá trường hợp ma trận 4x4, vì vậy tôi không thể nhận xét về chức năng nâng cao; Tôi chỉ chỉ ra một số tùy chọn.


Theo kinh nghiệm của tôi (ma trận lớn hơn), Boost.UBLAS được sử dụng nhiều hơn. Tuy nhiên, khi tôi xem xét nó, tôi không thích nó (chủ yếu là vì tài liệu này) nên tôi tập trung vào Eigen. Eigen có một mô-đun hình học , nhưng tôi đã không sử dụng nó cho mình.
Jitse Niesen

Eigen rõ ràng được sử dụng bởi ROS (nhà để xe), Celestia, Koffice và libmv. Tôi thấy một số câu chuyện phiếm về UBLAS, nhưng đã có một thời gian khó khăn khi bắt gặp dự án quảng cáo sử dụng nó. Ditto cho NT2. Bạn có thể giải thích những điều tốt bạn đã nghe?
Catskul

Đó là trong một cuộc thảo luận về danh sách gửi thư Boost về việc thêm thư viện LinAlg hiện đại vào Boost - Eigen và NT2 đều được đề cập là những ứng cử viên có thể, nhưng chỉ các nhà phát triển NT2 bày tỏ sự quan tâm theo đuổi nó. Cả hai thư viện có vẻ tốt; như bạn đã nói, Eigen phổ biến hơn một chút, và cũng nhiều C ++ hơn - ish; NT2 được thiết kế để bắt chước MATLAB càng nhiều càng tốt.
Jeff Hardy

8

Tôi chưa quen với chủ đề này, vì vậy tôi không thể nói nhiều, nhưng BLAS gần như là tiêu chuẩn trong điện toán khoa học. BLAS thực sự là một tiêu chuẩn API, có nhiều triển khai. Tôi thực sự không chắc chắn việc triển khai nào là phổ biến nhất hoặc tại sao.

Nếu bạn cũng muốn có thể thực hiện các phép toán đại số tuyến tính phổ biến (hệ thống giải, hồi quy bình phương nhỏ nhất, phân tách, v.v.) hãy xem xét LAPACK .


7

Còn GLM thì sao?

Nó dựa trên đặc tả Ngôn ngữ tạo bóng OpenGL (GLSL) và được phát hành theo giấy phép MIT. Rõ ràng nhắm vào các lập trình viên đồ họa


tốt, nó cung cấp vector lập trình đồ họa và ma trận. nó giới thiệu một lượng chi phí khá lớn để tuân thủ GLSL (nếu bạn có thể làm điều đó trong GLSL, hầu hết thời gian thực hiện trong GLSL sẽ tốt hơn đặc biệt với GL 4.x) và bỏ lỡ nhiều nguyên tắc lập trình đồ họa (bực bội, AABB, BB, ellipsoid ). Giao diện swizzle của nó là béo phì. Thay thế tốt hơn nhiều sẽ là nếu nó có các hàm ".xyzz ()" được tạo bằng một số tạo mã. Thật hoàn hảo khi bạn phải tạo nguyên mẫu cho các ứng dụng opengl và bắt đầu thể hiện những mặt tiêu cực của nó trong các dự án lớn hơn. không bao giờ viết mã thư viện toán học.
CoffeDeveloper

5

Tôi sẽ thêm phiếu bầu cho Eigen: Tôi đã chuyển rất nhiều mã (hình học 3D, đại số tuyến tính và phương trình vi phân) từ các thư viện khác nhau sang thư viện này - cải thiện cả hiệu suất và khả năng đọc mã trong hầu hết các trường hợp.

Một lợi thế không được đề cập: rất dễ sử dụng SSE với Eigen, giúp cải thiện đáng kể hiệu suất của các hoạt động 2D-3D (trong đó mọi thứ có thể được đệm thành 128 bit).


1
Toàn bộ "nếu bạn làm điều này thì hãy chắc chắn rằng ..." điều đó đánh vào tôi như một lá cờ đỏ. Cho đến nay tôi đã hai lần gặp phải những vấn đề này và tôi mới bắt đầu sử dụng nó. Tôi thực sự hy vọng không gây gánh nặng cho các nhà phát triển trong tương lai vì biết tất cả các loại đặc trưng của từng thư viện bao gồm: cụ thể là các vấn đề căn chỉnh khi nó gặp sự cố nếu bạn không sử dụng một số macro nhất định mỗi khi bạn có thành viên và thực tế là chúng có chức năng lan truyền cho từng cá nhân các lớp trên nhiều tiêu đề. Một mình nó có thể không ngăn tôi chọn nó, nhưng nó được gửi lên một chút cờ đỏ.
Catskul

1
Căn chỉnh và macro đó chỉ quan trọng nếu bạn sử dụng SSE, điều này không có nghĩa là bắt buộc. Và nếu bạn sử dụng SIMD, những vấn đề đó sẽ xuất hiện bất cứ thư viện nào bạn sử dụng. Ít nhất Eigen không chỉ gặp sự cố, nhưng cung cấp các thông báo lỗi có ý nghĩa trực tiếp chỉ ra vấn đề.
ima

Và có một cách dễ dàng để tránh macro căn chỉnh - sử dụng con trỏ hoặc tham chiếu làm thành viên.
ima

1
Tôi không nghĩ đó là sự thật. Tôi đã sử dụng không có tùy chọn SSE đặc biệt và đã gặp một số sự cố sau khi sử dụng nó với các thùng chứa stl. Có tôi biết nó mang lại cho bạn những thông điệp hữu ích và Có tôi biết có những hướng dẫn đặc biệt, nhưng đó là quan điểm của tôi. Tôi không muốn tạo gánh nặng cho các nhà phát triển khác bằng các hướng dẫn đặc biệt cho mỗi thư viện đi kèm. Việc không vượt qua điều giá trị chẳng hạn là quá nhiều.
Catskul

Tôi chỉ phát hiện ra rằng nhánh phát triển mới nhất có một số định nghĩa bạn có thể sử dụng để tắt liên kết và tránh các vấn đề liên quan.
Catskul

4

Được rồi, tôi nghĩ rằng tôi biết những gì bạn đang tìm kiếm. Dường như GGT là một giải pháp khá tốt, như đề xuất của Reed Copsey.

Cá nhân, chúng tôi đã cuộn thư viện nhỏ của riêng mình, bởi vì chúng tôi xử lý các điểm hợp lý rất nhiều - rất nhiều NURBS và Beziers hợp lý.

Nó chỉ ra rằng hầu hết các thư viện đồ họa 3D thực hiện các tính toán với các điểm phóng chiếu không có cơ sở trong toán học phóng xạ, bởi vì đó là những gì giúp bạn có câu trả lời bạn muốn. Chúng tôi đã kết thúc bằng cách sử dụng các điểm Grassmann, có nền tảng lý thuyết vững chắc và giảm số lượng các loại điểm. Điểm Grassmann về cơ bản là cùng các tính toán mà mọi người đang sử dụng, với lợi ích của một lý thuyết mạnh mẽ. Quan trọng nhất, nó làm cho mọi thứ rõ ràng hơn trong tâm trí của chúng tôi, vì vậy chúng tôi có ít lỗi hơn. Ron Goldman đã viết một bài báo về các điểm Grassmann trong đồ họa máy tính có tên "Trên nền tảng đại số và hình học của đồ họa máy tính" .

Không liên quan trực tiếp đến câu hỏi của bạn, nhưng một bài đọc thú vị.


Nó cố tình mở kết thúc ở chỗ tôi không biết sự đánh đổi là gì. Có lẽ công bằng khi nói rằng hình học là mối quan tâm chính của chúng tôi về chiều kích của hình học là không rõ ràng. Hiện tại nó là 2/3 (2 + thời gian) và theo giả thuyết có thể khá cao (3dims + time + multi-dim-costmaps).
Catskul

Tôi đồng ý với câu hỏi. Ví dụ, rất nhiều ứng dụng loại này cần hiệu năng thời gian thực (hành vi thời gian nhất quán), trong khi nhiều ứng dụng khác chỉ tốt khi từ bỏ tính nhất quán và / hoặc tốc độ cho chính xác.
TED

Vì vậy, bạn đang nói rằng trong số các thư viện mà bạn đã điều tra, không có ai chăm sóc NURBS và Beziers? Bất kỳ lý do cụ thể nào cho việc không lấy một trong các thư viện hiện có và xây dựng hỗ trợ NURBS và Bezier cùng với nó?
Catskul

Điều tôi đã cố gắng nói là NURBS và Beziers hợp lý sử dụng các điểm kiểm soát hợp lý nhiều hơn hầu hết các ứng dụng 3d, vì vậy chúng tôi đã phạm nhiều sai lầm hơn. Thông thường, hầu hết các ứng dụng 3d chỉ có các điểm và vectơ 3d vani cho đến khi trải qua quá trình chuyển đổi phối cảnh. Nhiều thuật toán của chúng tôi phải có khả năng xử lý chính xác các điểm có trọng số / hợp lý / phóng xạ và cartesian, qua lại, v.v.
tfinniga


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.