Sebagian besar pemrograman saya adalah kode penelitian satu kali dalam C untuk saya gunakan sendiri. Saya belum pernah mendistribusikan kode apa pun selain dari kolaborator dekat. Saya telah mengembangkan suatu algoritma yang saya terbitkan dalam jurnal ilmiah. Saya ingin memberikan kode sumber dan mungkin kode yang dapat dieksekusi dalam suplemen online ke artikel. Seorang kolega meminta saya membuat generalisasi untuk algoritma yang mengharuskan saya untuk menulis dalam C ++ (ack!) Dan yang mengharuskan saya menyelesaikan sistem linear padat kecil. Jika saya berhasil mendapatkan basis pengguna untuk algoritma itu akan sebagian karena bilah entri untuk menggunakannya rendah (seperti di lantai). Pengguna potensial tidak akan menginstal pustaka, dll. Untuk menggunakan kode. Saya ingin kode sepenuhnya berdiri sendiri dan tidak terbebani oleh lisensi apa pun. Saya mungkin menulis solver saya sendiri dengan mengambil sesuatu dari Golub dan van Loan, tetapi saya lebih suka menggunakan vanilla solver yang sudah ditulis orang lain jika ada di luar sana. Saran dihargai. Terima kasih!
sumber
Jawaban:
Saya akan menyarankan untuk menduplikasi antarmuka Lapack ke fungsi yang Anda butuhkan, kemungkinan besar Anda hanya perlu
dgesv
. Dengan begitu orang-orang yang telah menginstal Lapack dapat dengan mudah menautkannya dan itu hanya akan berfungsi. Untuk orang-orang yang tidak menginstal Lapack, Anda memberikan implementasi sederhana Anda sendiri dari fungsi ini, atau mungkin mengimplementasikannya menggunakan Eigen atau FLENS seperti yang disarankan orang lain.Di tanah Fortran, perpustakaan Lapack adalah standar, sehingga kebanyakan orang hanya menggunakannya dan hanya itu, alih-alih menyediakan implementasi mereka sendiri.
sumber
Kesalahan yang sangat awal yang dilakukan banyak orang ketika memulai dalam komputasi ilmiah adalah mengasumsikan bahwa Anda perlu menulis semua kode Anda dalam bahasa yang sama. Saya pikir ini sebagian besar karena alasan historis, ketika tidak jelas bagaimana membuat program yang dikompilasi berkomunikasi satu sama lain di seluruh versi genap dari kompiler yang sama. Yang mengatakan, dalam hal ini, jika Anda akan menggunakan C ++, ada beberapa pustaka template header C ++ yang sangat bagus yang mungkin sesuai dengan kebutuhan Anda.
Karena Anda mendistribusikan kode untuk alasan akademis, dan Anda ingin memasukkan pemecah aljabar linier yang padat ke dalam kode Anda, saya sangat menyarankan Anda mempertimbangkan Eigen . Eigen telah dilisensikan di bawah Lisensi Publik Mozilla dan merupakan perpustakaan khusus header. Ini berarti Anda dapat mendistribusikan Eigen dengan kode Anda dalam bentuk sumber (ini tidak memberlakukan batasan lisensi pada kode Anda), dan Anda akan menerima akses ke kemampuan umumnya, termasuk pemecah linear padat yang sangat efisien. Seperti yang disebutkan GertVdE, Anda memiliki beberapa opsi lain .
sumber
Jika Anda menginginkan pemecah yang dapat diandalkan untuk sistem persamaan linear, saya akan merekomendasikan FLENS . Ini berisi implementasi ulang yang tepat dari LAPACK (itu bahkan mereproduksi kesalahan pembulatan yang sama seperti LAPACK jika implementasi BLAS single-threaded digunakan). Ini berlaku untuk semua fungsi FLENS-LAPACK (bersama dengan fungsi utilitas sekitar 100 rutin).
FLENS berada di bawah Lisensi BSD dan karena itu memungkinkan untuk dimasukkan ke dalam produk-produk berpemilik.
FLENS hanya header dan jika Anda hanya perlu subset dari FLENS saya bisa memberi Anda versi stripped-down yang hanya berisi fungsi-fungsi yang Anda butuhkan. FLENS dilengkapi dengan implementasi BLAS referensi sendiri. Tetapi secara opsional, pengguna Anda dapat menautkan pustaka BLAS yang dioptimalkan seperti ATLAS, OpenBLAS atau GotoBALS. Untuk matriks besar ini memberikan keuntungan kinerja sekitar 40% dibandingkan dengan Eigen.
Dan ya, Eigen juga menggunakan test suite LAPACK untuk memeriksa hasilnya. Mereka melakukan ini untuk 3 fungsi (Lu, Cholesky dan Eigenvalues / -vektor dari matriks simetris). Namun, perhitungan nilai eigen / -vektor dari matriks non-simetris akan gagal dalam test suite LAPACK.
Penafian: Ya, FLENS adalah bayi saya! Itu berarti saya mengkodekan sekitar 95% dari itu dan setiap baris kode tidak sia-sia.
sumber