Apakah ada yang punya rekomendasi tentang perpustakaan matriks C ++ yang dapat digunakan dan cepat?
Yang saya maksud dengan dapat digunakan adalah sebagai berikut:
- Objek matriks memiliki antarmuka yang intuitif (mis .: saya dapat menggunakan baris dan kolom saat pengindeksan)
- Saya dapat melakukan apa saja dengan kelas matriks yang dapat saya lakukan dengan LAPACK dan BLAS
- Mudah dipelajari dan menggunakan API
- Relatif tanpa rasa sakit untuk menginstal di Linux (saya menggunakan Ubuntu 11.04 sekarang)
Bagi saya, kegunaan lebih penting daripada kecepatan atau penggunaan memori saat ini, untuk menghindari optimasi prematur. Dalam menulis kode, saya selalu dapat menggunakan array 1-D (atau vektor STL) dan aritmatika indeks atau pointer yang tepat untuk meniru sebuah matriks, tetapi saya lebih suka untuk tidak menghindari bug. Saya juga ingin memfokuskan upaya mental saya pada masalah aktual yang saya coba selesaikan dan memprogram ke dalam domain masalah, daripada menggunakan bagian dari perhatian terbatas saya untuk mengingat semua trik pemrograman kecil yang saya gunakan untuk meniru matriks sebagai array. , dan ingat perintah LAPACK, dan sebagainya. Plus, semakin sedikit kode yang harus saya tulis, dan semakin terstandarisasi, semakin baik.
Padat versus jarang belum penting; beberapa matriks yang saya hadapi akan jarang, tetapi tidak semuanya. Namun, jika paket tertentu menangani matriks padat atau jarang dengan baik, perlu disebutkan.
Templating juga tidak terlalu berarti bagi saya, karena saya akan bekerja dengan tipe numerik standar dan tidak perlu menyimpan apa pun selain ganda, float, atau int. Itu bagus, tetapi tidak perlu untuk apa yang ingin saya lakukan.
sumber
Jawaban:
Saya telah mengumpulkan yang berikut dari riset online sejauh ini:
Saya telah menggunakan Armadillo sedikit, dan menemukan antarmuka cukup intuitif, dan mudah untuk menemukan paket biner untuk Ubuntu (dan saya mengasumsikan distro Linux lainnya). Saya belum mengkompilasinya dari sumber, tetapi harapan saya adalah itu tidak akan terlalu sulit. Itu memenuhi sebagian besar kriteria desain saya, dan menggunakan aljabar linier padat. Itu bisa memanggil rutinitas LAPACK atau MKL. Biasanya tidak perlu mengkompilasi Armadillo, itu adalah pustaka berbasis template murni: Anda hanya menyertakan header dan tautan ke BLAS / LAPACK atau MKL dll.
Saya pernah mendengar hal-hal baik tentang Eigen , tetapi belum pernah menggunakannya. Ini diklaim cepat , menggunakan templating, dan mendukung aljabar linier padat. Itu tidak memiliki LAPACK atau BLAS sebagai ketergantungan, tetapi tampaknya mampu melakukan semua yang dapat dilakukan LAPACK (ditambah beberapa hal yang tidak bisa LAPACK). Banyak proyek menggunakan Eigen, yang menjanjikan. Ini memiliki paket biner untuk Ubuntu, tetapi sebagai pustaka header-saja itu sepele untuk digunakan di tempat lain juga.
The Matrix Template Library versi 4 juga tampak menjanjikan, dan menggunakan template. Ini mendukung aljabar linier yang padat dan jarang, dan dapat memanggil UMFPACK sebagai pemecah yang jarang. Fiturnya agak tidak jelas dari situs web mereka. Ini memiliki paket biner untuk Ubuntu, dapat diunduh dari situs web mereka.
PETSc , yang ditulis oleh sebuah tim di Argonne National Laboratory, memiliki akses ke pemecah linear yang jarang dan padat, jadi saya berasumsi bahwa itu dapat berfungsi sebagai perpustakaan matriks. Ini ditulis dalam C, tetapi memiliki binding C ++, saya pikir (dan bahkan jika tidak, memanggil C dari C ++ tidak ada masalah). Dokumentasinya sangat menyeluruh. Paket ini sedikit berlebihan untuk apa yang ingin saya lakukan sekarang (perkalian dan pengindeksan matriks untuk mengatur program linear bilangan bulat), tetapi dapat berguna sebagai format matriks untuk saya di masa depan, atau untuk orang lain yang memiliki kebutuhan berbeda daripada saya.
Trilinos , yang ditulis oleh tim di Sandia National Laboratory, menyediakan antarmuka C ++ berorientasi objek untuk matriks padat dan jarang melalui komponen Epetra-nya, dan antarmuka templated untuk matriks padat dan jarang melalui komponen Tpetra-nya. Ini juga memiliki komponen yang menyediakan fungsi linear solver dan eigensolver. Dokumentasi tampaknya tidak dipoles atau menonjol seperti PETSc; Trilinos sepertinya analog Sandia dari PETSc. PETSc dapat memanggil beberapa pemecah Trilinos. Binari untuk Trilinos tersedia untuk Linux.
Blitz adalah pustaka berorientasi objek C ++ yang memiliki binari Linux. Tampaknya tidak dipelihara secara aktif (2012-06-29: versi baru baru saja muncul kemarin!), Meskipun milis aktif, jadi ada beberapa komunitas yang menggunakannya. Tampaknya tidak melakukan banyak hal dalam aljabar linear numerik di luar BLAS, dan tampak seperti perpustakaan matriks padat. Itu menggunakan template.
Boost :: uBLAS adalah pustaka berorientasi objek C ++ dan bagian dari proyek Boost. Ini mendukung templating dan aljabar linear numerik yang padat. Saya pernah mendengar itu tidak terlalu cepat.
The Template numerik Toolkit adalah C ++ library berorientasi objek yang dikembangkan oleh NIST. Penulisnya, Roldan Pozo, tampaknya memberikan kontribusi tambalan sesekali, tetapi tampaknya tidak lagi dalam pengembangan aktif (pembaruan terakhir adalah 2010). Ini berfokus pada aljabar linier yang padat, dan menyediakan antarmuka untuk beberapa dekomposisi matriks dasar dan pemecah nilai eigen.
Elemental , yang dikembangkan oleh Jack Poulson, adalah paket perangkat lunak aljabar linier padat dengan memori terdistribusi (paralel) yang ditulis dengan gaya yang mirip dengan FLAME . Untuk daftar fitur dan latar belakang proyek, lihat dokumentasinya . FLAME sendiri memiliki pustaka terkait untuk aljabar linier padat berurutan dan berbagi-memori, yang disebut libflame , yang tampaknya ditulis dalam objek-berorientasi C. Libflame terlihat sangat mirip LAPACK, tetapi dengan notasi yang lebih baik yang mendasari algoritma untuk membuat pengembangan numerik cepat perpustakaan aljabar linear lebih merupakan sains dan lebih sedikit dari seni hitam.
Ada perpustakaan lain yang dapat ditambahkan ke daftar; jika kita menghitung paket aljabar linier yang jarang sebagai "pustaka matriks", yang gratis terbaik yang saya ketahui di C adalah SuiteSparse , yang diprogram dalam gaya berorientasi objek. Saya telah menggunakan SuiteSparse dan merasa cukup mudah untuk mengambilnya; itu tergantung pada BLAS dan LAPACK untuk beberapa algoritma yang menguraikan masalah-masalah yang jarang menjadi banyak sub-masalah kecil, aljabar linier yang padat. Penulis utama paket ini, Tim Davis, sangat membantu dan seorang pria yang hebat.
The Harwell Subroutine Perpustakaan terkenal karena jarang rutinitas aljabar linear mereka, dan gratis untuk pengguna akademis, meskipun Anda harus melalui proses ini mengisi formulir dan menerima e-mail untuk setiap file yang ingin Anda download. Karena subrutin sering kali memiliki dependensi, menggunakan satu solver mungkin perlu mengunduh lima atau enam file, dan prosesnya bisa agak membosankan, terutama karena bentuk persetujuannya tidak instan.
Ada juga pemecah aljabar linier lain yang jarang, tetapi sejauh yang saya tahu, MUMPS dan paket lainnya sebagian besar terfokus pada solusi sistem linear, dan menyelesaikan sistem linear adalah yang paling tidak menjadi perhatian saya saat ini. (Mungkin nanti, saya akan membutuhkan fungsionalitas itu, dan itu bisa bermanfaat bagi orang lain.)
sumber
Dokumen ini ditulis pada bulan Maret 2009 untuk membantu dalam pemilihan perpustakaan aljabar linier untuk perpustakaan ilmiah. Ini mengevaluasi portabilitas, antarmuka tingkat tinggi dan lisensi untuk beberapa perpustakaan, di antaranya Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos dan uBlas. Tampaknya sangat menyukai Flens dan Seldon . (Salah satu persyaratan adalah bahwa template C ++ dan matriks jarang harus didukung.)
sumber
Dari semua proyek yang tercantum di atas, hanya ada dua beban berat yang sangat banyak digunakan (dan untuk alasan yang baik): PETSc dan Trilinos. Keduanya dikembangkan secara profesional dan memiliki basis pengembang yang besar. Semua yang lain adalah proyek yang agak kecil dibandingkan dengan dua ini, dan saya akan merekomendasikan pergi bersama mereka karena (i) mereka akan didukung untuk waktu yang lama untuk datang dan (ii) mereka cenderung sudah memiliki semua fungsi yang Anda perlukan tentang aljabar linier (dan banyak lagi di atas itu).
sumber
jika kamu mau
Maka saya sarankan Anda untuk melihat FLENS perpustakaan saya . Saya mendesainnya untuk tugas-tugas semacam ini. Namun, itu membutuhkan kompiler konform C ++ 11 (mis. Gcc 4.7 atau dentang).
FLENS memberi Anda kinerja yang persis sama dengan implementasi BLAS yang mendasarinya. Ada beberapa tolok ukur (agak lama) yang menunjukkan ini
Hal yang sama dapat dikatakan tentang FLENS-LAPACK itu hanya memberi Anda kinerja yang sama persis seperti LAPACK Netlib jika implementasi BLAS yang sama digunakan.
Mengenai tolok ukur baru biarkan saya masuk ke lebih detail ...
Beberapa waktu lalu saya bertanya kepada Clint Whaley (penulis ATLAS) apa pendapatnya tentang tolok ukur yang diterbitkan di situs Eigen. Dia hanya mengkonfirmasi dugaan saya bahwa tolok ukur ini kemungkinan besar tidak dapat diandalkan. Sementara itu, beberapa tolok ukur lain yang disadari seperti yang disarankan Clint. Detail dapat ditemukan di situs ATLAS dan milis Eigen. Benchmark tidak disajikan dengan baik dalam grafik tetapi menunjukkan bahwa ATLAS selalu sekitar 40% lebih cepat dari Eigen. Ini bertentangan dengan tolok ukur dari situs Eigen tetapi mengkonfirmasi tolok ukur lain (misalnya yang dari blaze-lib).
Perhatikan bahwa untuk aljabar linier numerik yang padat, produk matriks-matriks paling relevan. Secara pribadi saya tidak peduli apakah Eigen atau ATLAS lebih cepat. Jika Eigen lebih cepat dari ATLAS maka saya akan menggunakan Eigen sebagai BLAS-backend.
Penafian: Ya, FLENS adalah bayi saya! Itu berarti saya mengkodekan sekitar 95% dari itu dan setiap baris kode tidak sia-sia :-)
sumber
Saya telah menggunakan GMM ++ selama beberapa waktu dan saya senang dengan itu.
sumber
Pada dasarnya pertanyaan yang sama muncul di SO:
Apa yang paling banyak digunakan C ++ vektor / matriks matematika / perpustakaan aljabar linier, dan pengorbanan biaya dan manfaatnya?
(Ini menambah nilai pada jawaban Geoff.)
sumber
Apa yang akan menjadi perpustakaan matriks terbaik untuk berurusan dengan matriks ukuran kecil, yang umum digunakan, misalnya, ketika merakit matriks elemen hingga, untuk melakukan operasi tensor dan sebagainya.
Saya sudah menggunakan PETSc untuk solusi sistem linear besar yang jarang muncul dalam aplikasi saya, tetapi saya saat ini menggunakan perpustakaan sederhana saya sendiri untuk menangani matriks / vektor ini ... Saya sedang mempertimbangkan untuk pindah ke perpustakaan yang lebih cepat, seperti yang disebutkan di atas.
Apa yang akan menjadi pilihan terbaik untuk berpasangan dengan PETSc? Eigen? Armadillo? MENINGKATKAN :: uBlas? MTL4? Saya menggunakan beberapa hal dari BOOST, jadi, pertama saya berpikir untuk menggunakan BOOST :: uBlas, tetapi tidak ada banyak dokumentasi, contoh, dan sebagainya ...
sumber
Armadillo, Boost dan lainnya sekarang dimasukkan sebagai bagian dari Ceemple, lingkungan komputasi teknis C ++ berbasis JIT yang cepat. Tersedia (gratis) dari http://www.ceemple.com .
sumber
Terkejut tidak ada yang menyebutkan TooN sejauh ini. Sudah senang menggunakannya selama hampir 3 tahun sekarang.
Ini sangat mirip dengan Eigen meskipun tidak komprehensif. Namun saya pikir ini memiliki sintaks yang lebih bagus dalam beberapa hal.
Itu juga dilengkapi dengan kelas-kelas yang membantu memodelkan transformasi umum yang sering dijumpai dalam Grafik dan Visi, berdasarkan Lie Groups (Euclidean Khusus / Orthogonal dalam 2 dan 3 dimensi, dll) dan Lie Algebras yang terkait.
sumber
HASEM Matrix C ++ Library adalah yang benar-benar Anda butuhkan http://sourceforge.net/projects/hasem/
sumber