2011-02-02 15 views
17

Tôi đang bắt đầu một dự án khoa học-tính toán mới trong C++ và kể từ khi có rất nhiều quy trình mở rộng, tôi đang cân nhắc sử dụng Armadillo hoặc Blitz ++ để xử lý mảng/ma trận/tensor hiệu quả. Cái nào tốt hơn để sử dụng?Armadillo vs Blitz ++

+0

Bạn có thực sự ** cần nhiều đại số tuyến tính không? Nếu có, không sử dụng C++ (sử dụng Matlab hoặc tương đương). Nếu không, Armadillo sẽ rất tuyệt, và nếu bạn thực sự phải sử dụng C++ vì yêu cầu khác, nó có lẽ là lựa chọn tốt nhất.Tuy nhiên, tôi không bao giờ sử dụng nó để cho bạn biết (tôi đã sử dụng Blitz ++ và boost :: ublas với một số thất vọng mặc dù). –

+0

Bạn đã xem thư viện Boost Math and Numerics (http://www.boost.org/doc/libs/?view=category_Math) chưa? – yasouser

+1

"Cái nào tốt hơn": tốt hơn như thế nào - tốc độ thô (trên lớp * của tôi về các vấn đề), ổn định, ** thời gian để tìm hiểu **? Tôi muốn có một bảng nhỏ với các con số: các trang tài liệu, các dòng ví dụ, các dòng mã, để so sánh loại này. – denis

Trả lời

17

Chúng tôi đã rất hài lòng với Armadillo mà chúng tôi đã gói cho R sử dụng gói tích hợp Rcpp R/C++ --- gói kết quả là RcppArmadillo.

Conrad rất hữu ích và cam kết, và Armadillo đang được phát triển tích cực. Đó là sự hiểu biết của tôi rằng Blitz ++, trong khi con đường phá vỡ trong thời gian của nó và rất có ảnh hưởng đối với đại số tuyến tính theo khuôn mẫu, không còn được phát triển tích cực nữa.

Chỉnh sửa 2012-06-28: Rõ ràng có sự phát triển Blitz ++ mới đang diễn ra tại Sourceforge site for Blitz.

Chỉnh sửa 2017-12-16: Có vẻ như Blitz++ hiện đang ở GitHub.

+0

Ai đó đã cố chỉnh sửa bài đăng của bạn ngay bây giờ nói rằng "Blitz ++ vẫn được phát triển và phiên bản 0.10 mới vừa được phát hành hôm nay" - bạn có thể xác nhận và nếu thay đổi đúng bài đăng của mình không? –

+0

@ShadowWizard: Cảm ơn bạn đã đứng đầu, tôi vừa thực hiện chỉnh sửa sau khi tìm tệp. –

+1

Dirk, Blitz cần được hỗ trợ. –

12

Như mọi khi trong trường hợp này, khi giao dịch với đại số tuyến tính và C++, tôi nhiệt liệt đề nghị xem xét Eigen.

http://eigen.tuxfamily.org/index.php?title=Main_Page

Có lẽ một trong những thư viện đại số tuyến tính C++ tốt nhất từng được viết theo ý kiến ​​của tôi.

+2

Tôi đang làm việc với Eigen vào lúc này và khá hài lòng với nó. –

+0

Đến từ Matlab, Eigen trông hoàn toàn tuyệt vời! Làm thế nào mạnh mẽ là nó trong việc xác định một loại vector tùy chỉnh cho mỗi phần tử trong một mảng? Tôi muốn có thể sử dụng nó với các hình ảnh màu, nghĩa là các mảng "3D" có kích thước M * N * (đỏ, lục, lam). –

+0

Tôi thấy rằng [Armadillo] (http://arma.sourceforge.net) nói chung làm tốt hơn với việc cung cấp các hàm/API giống như Matlab. Đối với mảng "3D", nó có [Cube class] (http://arma.sourceforge.net/docs.html#Cube). – mtall

4

Để hoàn chỉnh: Tôi khuyên bạn nên chống lại Boost :: uBLAS, chỉ trong trường hợp ai đó đang xem xét. Tôi đã sử dụng nó và API rất cồng kềnh và hiệu suất tổng thể thấp hơn EigenArmadillo; điều này thậm chí còn được đề cập trong phần Câu hỏi thường gặp của uBLAS

H: Tôi có nên sử dụng uBLAS cho các dự án mới không?

A: Tại thời điểm viết (09/2012), có rất nhiều thư viện ma trận tốt, ví dụ: MTL4, armadillo, eigen ... uBLAS cung cấp hiệu suất tốt (nhưng không nổi bật). Mặt khác, cải tiến lớn cuối cùng của uBLAS là vào năm 2008 và không có thay đổi đáng kể nào được cam kết kể từ năm 2009. Vì vậy, người ta nên tự hỏi mình một số câu hỏi để hỗ trợ quyết định: ... Dễ sử dụng? uBLAS rất dễ sử dụng cho những thứ đơn giản, nhưng cần kiến ​​thức phong phú về C++ khi bạn rời khỏi đường dẫn. Hiệu suất? Có lựa chọn thay thế nhanh hơn. Cắt cạnh? uBLAS đã hơn 10 tuổi và bỏ lỡ tất cả những thứ mới từ C++ 11.

"Tôi bắt đầu một dự án khoa học-máy tính mới ..."

Armadillo API cố gắng bắt chước MATLAB cú pháp, mà tôi sẽ giả định bạn đã quen thuộc với.

0

Một điều mà tôi gặp phải làm việc với Ublas là nó không cung cấp tùy chọn để thực hiện hành động như max(u,0), u+1, abs(u) nơi u là một vector. Ngoài ra, cú pháp của Boost Ublas là cồng kềnh để viết so với ARMADILLO. Có so sánh tốc độ quá [click] (Compare blitz++, armadillo, boost::MultiArray) Vì vậy, tôi khuyên bạn nên sử dụng Armadillo.

Các vấn đề liên quan