selesaikan

12

Saya porting kode yang ada dari MATLAB ke C ++ dan memiliki sistem linier untuk menyelesaikan (daripada bentuk yang lebih khas A x = b )xA=bAx=b

Matriks padat, dan berbentuk umum, tetapi tidak lebih besar dari 1000x1000. Jadi dalam MATLAB, solusinya ditemukan oleh fungsi atau notasi forward-slashAmrdivide(b,A)x = b/A;

Bagaimana saya memecahkan ini dalam kode C ++ saya menggunakan rutin BLAS dan LAPACK?

Saya kenal dengan rutin LAPACK DGESVyang memecahkan untuk x .Ax=bx

Jadi, satu pemikiran yang saya miliki adalah melakukan manipulasi menggunakan matriks transpos identitas:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

Kemudian pecahkan bentuk terakhir menggunakan DGESVoperasi pada ditransfosikan . (jadi biaya untuk memindahkan A dan biaya untuk menyelesaikan sistem)ATA

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 mrdivideini berguna untuk orang lain.

NoahR
sumber

Jawaban:

10

AdgesvxATx=bTRANS = 'T'

Harap dicatat bahwa dengan BLAS atau LAPACK Anda tidak perlu mengubah (mengganti elemen dalam memori) menjadi matriks: sebagian besar subrutin memiliki TRANSargumen untuk mengakomodasi operasi pada matriks transpos atau pada matriks yang disimpan dengan tata letak memori yang berbeda. (Transposisi sama dengan mengubah tata letak memori Fortran-contiguous ke C-contiguos satu dan sebaliknya.)

Stefano M
sumber
Terima kasih atas jawaban dan penjelasannya! Saya telah melakukan sedikit pekerjaan dengan LAPACK dan sekarang saya tahu untuk mencari opsi TRANS. Saya mengalami masalah dalam menyelesaikan argumen TRANS 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.
NoahR
gesvx()gesvxATX=BATXT=BTXBAXBtidak. Bagus, itu lebih nyaman. Jika orang lain menemukan ini mencoba menggunakan binding numeric boost, saya akan mengatakan saya belum bisa mendapatkan antarmuka transpos yang digunakan dalam soln ini. untuk bekerja melalui binding.
NoahR
gesvxboost::numeric::bindingsATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
0

A

xA=bxQR=bx=bR1QT

A

Gil
sumber
3
ARR1