Saya baru mengenal ilmu komputasi dan saya sudah mempelajari metode dasar untuk integrasi, interpolasi, metode seperti RK4, Numerov dll pada c ++ tetapi baru-baru ini profesor saya meminta saya untuk belajar bagaimana menggunakan LAPACK untuk menyelesaikan masalah yang berkaitan dengan matriks. Seperti misalnya menemukan nilai eigen dari matriks kompleks. Saya tidak pernah menggunakan perpustakaan pihak ketiga dan saya hampir selalu menulis fungsi saya sendiri. Saya telah mencari-cari selama beberapa hari tetapi tidak dapat menemukan panduan ramah-amatir untuk Lapack. Semuanya ditulis dengan kata-kata yang saya tidak mengerti dan saya tidak tahu mengapa menggunakan fungsi yang sudah ditulis harus rumit ini. Mereka penuh dengan kata-kata seperti zgeev, dtrsv, dll. Dan saya frustrasi. Saya hanya ingin kode seperti pseudo-code ini:
#include <lapack:matrix>
int main(){
LapackComplexMatrix A(n,n);
for...
for...
cin>>A(i,j);
cout<<LapackEigenValues(A);
return 0;
}
Saya tidak tahu apakah saya bodoh atau amatir. Tetapi sekali lagi, ini seharusnya tidak terlalu sulit bukan? Saya bahkan tidak tahu apakah saya harus menggunakan LAPACK atau LAPACK ++. (Saya menulis kode dalam c ++ dan tidak memiliki pengetahuan tentang Python atau FORTRAN) dan cara menginstalnya.
Jawaban:
Saya akan tidak setuju dengan beberapa jawaban lain dan mengatakan bahwa saya percaya bahwa mencari tahu cara menggunakan LAPACK adalah penting dalam bidang komputasi ilmiah.
Namun, ada kurva belajar yang besar untuk menggunakan LAPACK. Ini karena ini ditulis pada tingkat yang sangat rendah. Kerugian dari itu adalah bahwa itu tampak sangat samar, dan tidak menyenangkan indra. Keuntungannya adalah bahwa antarmuka tidak ambigu dan pada dasarnya tidak pernah berubah. Selain itu, implementasi LAPACK, seperti Perpustakaan Intel Math Kernel sangat cepat.
Untuk keperluan saya sendiri, saya memiliki kelas C ++ tingkat tinggi saya sendiri yang membungkus subrutin LAPACK. Banyak perpustakaan ilmiah juga menggunakan LAPACK di bawahnya. Terkadang lebih mudah untuk hanya menggunakannya, tetapi menurut saya ada banyak nilai dalam memahami alat di bawahnya. Untuk itu, saya telah memberikan contoh kerja kecil yang ditulis dalam C ++ menggunakan LAPACK untuk membantu Anda memulai. Ini berfungsi di Ubuntu, dengan
liblapack3
paket diinstal, dan paket lain yang diperlukan untuk membangun. Ini mungkin dapat digunakan di sebagian besar distribusi Linux, tetapi instalasi LAPACK dan menghubungkannya dapat bervariasi.Ini filenya
test_lapack.cpp
Ini dapat dibangun menggunakan baris perintah
Ini akan menghasilkan nama yang dapat dieksekusi
test_lapack
. Saya telah mengatur ini untuk dibaca dalam file input teks. Berikut adalah file bernama yangmatrix.txt
mengandung matriks 3x3.Untuk menjalankan program cukup ketik
di baris perintah, dan output seharusnya
Komentar:
extern "C"
bagian di atas, dan saya telah menambahkan garis bawah kedgeev_
. Itu karena perpustakaan ditulis dan dibangun di Fortran, jadi ini perlu untuk membuat simbol cocok ketika menghubungkan. Ini adalah kompiler dan bergantung pada sistem, jadi jika Anda menggunakan ini pada Windows, semuanya harus berubah.sumber
Saya biasanya menolak memberi tahu orang apa yang menurut saya harus mereka lakukan daripada menjawab pertanyaan mereka, tetapi dalam kasus ini saya akan membuat pengecualian.
Lapack ditulis dalam FORTRAN dan API sangat mirip FORTRAN. Ada API C untuk Lapack yang membuat antarmuka sedikit lebih menyakitkan tetapi tidak akan pernah menjadi pengalaman yang menyenangkan untuk menggunakan Lapack dari C ++.
Atau, ada perpustakaan kelas matriks C ++ yang disebut Eigen yang memiliki banyak kemampuan Lapack, memberikan kinerja komputasi yang sebanding dengan implementasi Lapack yang lebih baik, dan sangat mudah digunakan dari C ++. Secara khusus, berikut adalah bagaimana kode contoh Anda dapat ditulis menggunakan Eigen
Contoh masalah nilai eigen ini adalah kasus uji untuk fungsi Lapack
dgeev
. Anda dapat melihat kode FORTRAN dan hasil untuk masalah ini contoh dgeev dan membuat perbandingan Anda sendiri.sumber
operator,
! Belum pernah melihat itu dilakukan dalam praktik sebenarnya :-)operator,
kelebihan itu lebih menarik / lebih baik daripada yang pertama kali muncul. Ini digunakan untuk menginisialisasi matriks. Entri yang menginisialisasi matriks dapat berupa konstanta skalar tetapi juga dapat merupakan matriks atau sub-matriks yang telah ditentukan sebelumnya. Sangat mirip MATLAB. Semoga kemampuan pemrograman C ++ saya cukup baik untuk mengimplementasikan sesuatu yang canggih sendiri ;-)Berikut jawaban lain dengan nada yang sama seperti di atas.
Anda harus melihat ke perpustakaan aljabar linier Armadillo C ++ .
Pro:
DGESV
omong kosong, hanyaX = solve( A, B )
(meskipun ada alasan di balik nama-nama fungsi LAPACK yang tampak aneh ...).Begini tampilan kode @ BillGreene dengan Armadillo:
sumber