Saya porting kode yang ada dari MATLAB ke C ++ dan memiliki sistem linier untuk menyelesaikan (daripada bentuk yang lebih khas A x = b )
Matriks padat, dan berbentuk umum, tetapi tidak lebih besar dari 1000x1000. Jadi dalam MATLAB, solusinya ditemukan oleh fungsi atau notasi forward-slashmrdivide(b,A)
x = b/A;
Bagaimana saya memecahkan ini dalam kode C ++ saya menggunakan rutin BLAS dan LAPACK?
Saya kenal dengan rutin LAPACK DGESV
yang memecahkan untuk x .
Jadi, satu pemikiran yang saya miliki adalah melakukan manipulasi menggunakan matriks transpos identitas:
Kemudian pecahkan bentuk terakhir menggunakan DGESV
operasi pada ditransfosikan . (jadi biaya untuk memindahkan A dan biaya untuk menyelesaikan sistem)
Apakah ada pendekatan yang lebih efisien atau lebih baik ?
Saya bekerja dengan matriks dan kelas vektor serta implementasi BLAS dari perpustakaan BOOST uBLAS serta binding ke rutinitas perpustakaan LAPACK. Saya telah menggunakan pengaturan ini dengan sukses untuk operasi lain dan saya berharap untuk menemukan solusi terbatas pada pustaka ini.
Juga, saya harus perhatikan bahwa saya hanya melakukan operasi jenis ini beberapa kali selama pengaturan kode, sehingga kinerja bukan masalah kritis.
Mungkin ini MATLAB dokumentasi tentang mrdivide
ini berguna untuk orang lain.
sumber
boost::numeric::bindings::lapack::gesvx()
, tetapi ini bukan bagian dari pertanyaan saya di sini. Jika saya berhasil, saya akan kembali dengan catatan tentang bagaimana melakukannya.gesvx()
gesvx
gesvx
boost::numeric::bindings
trans()
boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
sumber