Tampaknya banyak proyek perlahan-lahan datang pada kebutuhan untuk melakukan matematika matriks, dan jatuh ke dalam perangkap pertama membangun beberapa kelas vektor dan perlahan-lahan menambahkan fungsionalitas sampai mereka tertangkap membangun perpustakaan aljabar linier kustom setengah-assed, dan tergantung padanya.
Saya ingin menghindari itu sementara tidak membangun ketergantungan pada beberapa pustaka yang berhubungan secara tangensial (misalnya OpenCV, OpenSceneGraph).
Apa perpustakaan matriks matematika / aljabar linear yang umum digunakan di luar sana, dan mengapa memutuskan untuk menggunakan satu sama lain? Adakah yang disarankan untuk tidak menggunakan karena suatu alasan? Saya secara khusus menggunakan ini dalam konteks geometris / waktu * (2,3,4 Dim) * tetapi mungkin menggunakan data dimensi yang lebih tinggi di masa depan.
Saya mencari perbedaan berkenaan dengan: API, kecepatan, penggunaan memori, luasnya / kelengkapan, kesempitan / kekhususan, ekstensibilitas, dan / atau kematangan / stabilitas.
Memperbarui
Saya akhirnya menggunakan Eigen3 yang sangat saya sukai.
sumber
Jawaban:
Ada beberapa proyek yang telah diselesaikan pada Generic Graphics Toolkit untuk ini. GMTL di sana bagus - cukup kecil, sangat fungsional, dan telah digunakan cukup luas untuk menjadi sangat andal. OpenSG, VRJuggler, dan proyek lain semuanya telah beralih untuk menggunakan ini alih-alih matematika matriks / matriks lintingan tangan mereka sendiri.
Saya merasa cukup bagus - ia melakukan semuanya melalui templat, jadi sangat fleksibel, dan sangat cepat.
Edit:
Setelah diskusi komentar, dan pengeditan, saya pikir saya akan membuang lebih banyak informasi tentang manfaat dan kerugian untuk implementasi tertentu, dan mengapa Anda dapat memilih satu dari yang lain, mengingat situasi Anda.
GMTL -
Manfaat: API Sederhana, dirancang khusus untuk mesin grafis. Termasuk banyak tipe primitif yang ditujukan untuk rendering (seperti pesawat, AABB, quatenrions dengan banyak interpolasi, dll) yang tidak ada dalam paket lain. Memori overhead sangat rendah, cukup cepat, mudah digunakan.
Kelemahan: API sangat fokus khusus pada rendering dan grafik. Tidak termasuk matriks tujuan umum (NxM), dekomposisi dan penyelesaian matriks, dll, karena ini berada di luar ranah aplikasi grafik / geometri tradisional.
Eigen -
Manfaat: Bersihkan API , cukup mudah digunakan. Termasuk modul Geometri dengan angka empat dan transformasi geometris. Overhead memori rendah. Pemecahan penuh, sangat berkinerja tinggi dari matriks NxN besar dan rutinitas matematika tujuan umum lainnya.
Kerugian: Mungkin ruang lingkup sedikit lebih besar daripada yang Anda inginkan (?). Lebih sedikit geometris / render rutinitas khusus bila dibandingkan dengan GMTL (yaitu: definisi sudut Euler, dll).
IMSL -
Manfaat: Perpustakaan numerik yang sangat lengkap. Sangat, sangat cepat (konon pemecah tercepat). Sejauh ini, API matematika terbesar dan terlengkap. Didukung secara komersial, dewasa, dan stabil.
Kelemahan: Biaya - tidak murah. Sangat sedikit metode khusus geometris / render, jadi Anda harus menggulirkan Anda sendiri di atas kelas aljabar linier mereka.
NT2 -
Manfaat: Menyediakan sintaks yang lebih akrab jika Anda terbiasa dengan MATLAB. Memberikan dekomposisi dan penyelesaian penuh untuk matriks besar, dll.
Kelemahan: Matematika, tidak fokus rendering. Mungkin tidak sebagus Eigen.
LAPACK -
Manfaat: Sangat stabil, algoritma terbukti. Sudah ada sejak lama. Pemecahan matriks lengkap, dll. Banyak pilihan untuk matematika tidak jelas.
Kelemahan: Tidak terlalu berkinerja tinggi dalam beberapa kasus. Porting dari Fortran, dengan API ganjil untuk penggunaan.
Secara pribadi, bagi saya, hanya ada satu pertanyaan - bagaimana Anda berencana untuk menggunakan ini. Jika Anda fokus hanya pada rendering dan grafik, saya suka Generic Graphics Toolkit , karena kinerjanya baik, dan mendukung banyak operasi rendering yang berguna di luar kotak tanpa harus menerapkan sendiri. Jika Anda memerlukan penyelesaian matriks tujuan umum (yaitu: dekomposisi SVD atau LU dari matriks besar), saya akan menggunakan Eigen , karena ia menangani itu, menyediakan beberapa operasi geometris, dan sangat performan dengan solusi matriks besar. Anda mungkin perlu menulis lebih banyak dari grafik / operasi geometrik Anda sendiri (di atas matriks / vektor), tetapi itu tidak mengerikan.
sumber
Jadi saya orang yang cukup kritis, dan saya pikir jika saya akan berinvestasi di perpustakaan, saya lebih baik tahu apa yang saya hadapi. Saya pikir lebih baik bersikap terlalu keras pada kritik dan menyanjung pujian ketika meneliti; apa yang salah dengannya memiliki lebih banyak implikasi untuk masa depan daripada apa yang benar. Jadi saya akan pergi ke sini sedikit untuk memberikan jenis jawaban yang akan membantu saya dan saya harap akan membantu orang lain yang mungkin menempuh jalan ini. Perlu diingat bahwa ini didasarkan pada sedikit ulasan / pengujian yang telah saya lakukan dengan lib ini. Oh dan saya mencuri beberapa deskripsi positif dari Reed.
Saya akan menyebutkan di bagian atas bahwa saya menggunakan GMTL meskipun ada keistimewaan karena ketidakpercayaan Eigen2 terlalu besar untuk downside. Tapi saya baru-baru ini belajar bahwa rilis Eigen2 berikutnya akan berisi definisi yang akan mematikan kode penyelarasan, dan membuatnya aman. Jadi saya bisa beralih.Pembaruan : Saya sudah beralih ke Eigen3. Terlepas dari kekhasannya, ruang lingkup dan keanggunannya terlalu sulit untuk diabaikan, dan optimisasi yang membuatnya tidak aman dapat dimatikan dengan definisi.
Eigen2 / Eigen3
Manfaat:
LGPLMPL2, Bersih, API yang dirancang dengan baik, cukup mudah digunakan. Tampaknya terawat dengan baik dengan komunitas yang dinamis. Overhead memori rendah. Performa tinggi. Dibuat untuk aljabar linear umum, tetapi fungsionalitas geometris yang baik juga tersedia. Semua header lib, tidak perlu menautkan.Idiocyncracies / downsides: (Beberapa / semua ini dapat dihindari dengan beberapa definisi yang tersedia di
cabang pengembanganEigen3 saat ini)GMTL
Manfaat: LGPL, API Cukup Sederhana, dirancang khusus untuk mesin grafis. Termasuk banyak tipe primitif yang ditujukan untuk rendering (seperti pesawat, AABB, quatenrions dengan banyak interpolasi, dll) yang tidak ada dalam paket lain. Memori overhead sangat rendah, cukup cepat, mudah digunakan. Semua berbasis tajuk, tidak perlu tautan.
Idiocyncracies / downsides:
vec1 - vec2
tidak mengembalikan vektor normal sehinggalength( vecA - vecB )
gagal meskipunvecC = vecA - vecB
berfungsi. Anda harus membungkus seperti:length( Vec( vecA - vecB ) )
length( makeCross( vecA, vecB ) )
atau di
gmtl::length( gmtl::makeCross( vecA, vecB ) )
mana jika tidak, Anda dapat mencoba
vecA.cross( vecB ).length()
NT2
Tidak tahu karena mereka lebih tertarik pada header gambar fraktal dari halaman web mereka daripada kontennya. Tampak lebih seperti proyek akademik daripada proyek perangkat lunak yang serius.
Rilis terbaru lebih dari 2 tahun yang lalu.
Rupanya tidak ada dokumentasi dalam bahasa Inggris meskipun konon ada sesuatu dalam bahasa Prancis.
Tidak dapat menemukan jejak komunitas di sekitar proyek.
LAPACK & BLAS
Manfaat: Tua dan dewasa.
Kerugian:
sumber
Untuk apa nilainya, saya sudah mencoba Eigen dan Armadillo. Di bawah ini adalah evaluasi singkat.
Keuntungan Eigen: 1. Benar-benar mandiri - tidak ada ketergantungan pada BLAS atau LAPACK eksternal. 2. Dokumentasi yang layak. 3. Konon cepat, meskipun saya belum mengujinya.
Kerugian: Algoritma QR mengembalikan hanya satu matriks tunggal, dengan matriks R tertanam di segitiga atas. Tidak tahu dari mana sisa matriks berasal, dan tidak ada matriks Q yang dapat diakses.
Keuntungan Armadillo: 1. Berbagai dekomposisi dan fungsi lainnya (termasuk QR). 2. Cukup cepat (menggunakan templat ekspresi), tetapi sekali lagi, saya belum benar-benar mendorongnya ke dimensi tinggi.
Kekurangan: 1. Tergantung pada BLAS eksternal dan / atau LAPACK untuk dekomposisi matriks. 2. Dokumentasi kurang IMHO (termasuk spesifik wrt LAPACK, selain mengubah pernyataan #define).
Akan menyenangkan jika perpustakaan open source tersedia yang mandiri dan mudah digunakan. Saya telah mengalami masalah yang sama selama 10 tahun, dan itu membuat frustrasi. Pada satu titik, saya menggunakan GSL untuk C dan menulis pembungkus C ++ di sekitarnya, tetapi dengan C ++ modern - terutama menggunakan keunggulan templat ekspresi - kita tidak harus macam-macam dengan C di abad ke-21. Hanya tuppencehapenny saya.
sumber
Jika Anda mencari matriks / aljabar linier / optimasi kinerja tinggi pada prosesor Intel, saya akan melihat perpustakaan MKL Intel.
MKL dioptimalkan dengan cermat untuk kinerja run-time yang cepat - sebagian besar didasarkan pada standar fortran BLAS / LAPACK yang sangat matang. Dan kinerjanya berskala dengan jumlah core yang tersedia. Skalabilitas hands-free dengan core yang tersedia adalah masa depan komputasi dan saya tidak akan menggunakan perpustakaan matematika untuk proyek baru yang tidak mendukung prosesor multi-core.
Sangat singkat, itu termasuk:
Kelemahannya adalah bahwa API MKL bisa sangat kompleks tergantung pada rutinitas yang Anda butuhkan. Anda juga dapat melihat pustaka IPP (Integrated Performance Primitives) mereka yang disesuaikan dengan operasi pemrosesan gambar berkinerja tinggi, tetapi bagaimanapun juga cukup luas.
Paul
Perangkat Lunak CenterSpace, perpustakaan .NET Math, Centerspace.net
sumber
Saya pernah mendengar hal-hal baik tentang Eigen dan NT2 , tetapi belum secara pribadi digunakan. Ada juga Boost.UBLAS , yang saya percaya agak lama di gigi. Para pengembang NT2 sedang membangun versi berikutnya dengan maksud untuk meningkatkannya, sehingga mungkin ada gunanya.
Lin saya. alg. kebutuhan tidak diperluas melampaui kasus matriks 4x4, jadi saya tidak bisa mengomentari fungsionalitas canggih; Saya hanya menunjukkan beberapa opsi.
sumber
Saya baru mengenal topik ini, jadi saya tidak bisa mengatakan banyak, tetapi BLAS cukup standar dalam komputasi ilmiah. BLAS sebenarnya merupakan standar API, yang memiliki banyak implementasi. Sejujurnya saya tidak yakin implementasi mana yang paling populer atau mengapa.
Jika Anda ingin juga dapat melakukan operasi aljabar linear umum (sistem penyelesaian, regresi kuadrat terkecil, dekomposisi, dll.) Lihatlah ke dalam LAPACK .
sumber
Bagaimana dengan GLM ?
Ini didasarkan pada spesifikasi OpenGL Shading Language (GLSL) dan dirilis di bawah lisensi MIT. Jelas ditujukan untuk programmer grafis
sumber
Saya akan menambahkan suara untuk Eigen: Saya mem-porting banyak kode (geometri 3D, aljabar linier dan persamaan diferensial) dari pustaka yang berbeda ke yang satu ini - meningkatkan kinerja dan keterbacaan kode di hampir semua kasus.
Satu keuntungan yang tidak disebutkan: sangat mudah untuk menggunakan SSE dengan Eigen, yang secara signifikan meningkatkan kinerja operasi 2D-3D (di mana semuanya dapat diisi hingga 128 bit).
sumber
Oke, saya pikir saya tahu apa yang Anda cari. Tampaknya GGT adalah solusi yang cukup bagus, seperti yang disarankan Reed Copsey.
Secara pribadi, kami menggulung perpustakaan kecil kami sendiri, karena kami sering berurusan dengan poin-poin rasional - banyak NURBS dan Beziers yang rasional.
Ternyata sebagian besar pustaka grafik 3D melakukan perhitungan dengan titik-titik projektif yang tidak memiliki dasar dalam matematika projektif, karena itulah yang memberi Anda jawaban yang Anda inginkan. Kami akhirnya menggunakan poin Grassmann, yang memiliki fondasi teoritis yang kuat dan mengurangi jumlah jenis poin. Poin Grassmann pada dasarnya adalah perhitungan yang sama yang digunakan orang sekarang, dengan manfaat teori yang kuat. Yang paling penting, ini membuat segalanya lebih jelas dalam pikiran kita, jadi kita memiliki lebih sedikit bug. Ron Goldman menulis makalah tentang poin-poin Grassmann dalam grafik komputer yang disebut "On the Algebraic and Geometric Foundations of Computer Graphics" .
Tidak terkait langsung dengan pertanyaan Anda, tetapi bacaan yang menarik.
sumber
FLENS
http://flens.sf.net
Ini juga mengimplementasikan banyak fungsi LAPACK.
sumber
Saya menemukan perpustakaan ini cukup sederhana dan fungsional ( http://kirillsprograms.com/top_Vectors.php ). Ini adalah vektor tulang kosong yang diimplementasikan melalui templat C ++. Tidak ada barang mewah - hanya apa yang perlu Anda lakukan dengan vektor (tambahkan, kurangi kalikan, titik, dll).
sumber