Saat ini saya mencoba untuk murah menghitung perkiraan yang baik peringkat untuk matriks . Oleh karena itu saya menghitung penggunaan QR decompostion columnt pivoting
[Q,R,E]=qr(A)
di Matlab. Saya memperkirakan peringkat menggunakan
tol = size(A,n)*eps*norm(A,'fro');
r = sum(abs(diag(R))>tol)
Ini berfungsi dengan baik dan plot pada semua entri diagonal R terlihat seperti:
Jika port keseluruhan algoritma ke C / Fortran saya ganti [Q, R, E] = qr (A) menggunakan DGEQP3 dari LAPACK, yang juga menghitung kolom yang memutar dekomposisi QR. Tetapi jika saya menggunakan estimasi yang sama untuk peringkat saya kebanyakan mendapatkan kesalahan. Sepertinya plot yang sama untuk dihasilkan dari DGEQP3
Matriks input sama persis untuk kedua percobaan.
Pertanyaan saya sekarang adalah fungsi LAPACK mana yang diandalkan kolom dekomposisi QR dari Matlab?
Terima kasih atas bantuannya, Grisu
Sunting: DGEQPF memberikan hasil yang salah sama.
Sunting2:
- Matriks input padat dan dibangun sebagai E + s i g n ( E , F )
- Saya menggunakan LAPACK 3.4.0 dengan OpenBlas / GotoBLAS (64 bit)
- Matlab 7, 2007b, 2010b Linux 32bit
Sunting3: - Menggunakan GDB yang saya temukan, bahwa Matlab 2010b memanggil DGEQP3: # 3 0xaa46ce2f di dgeqp3_ () dari /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so Mengapa saya mendapatkan hasil yang salah dengan menggunakan LAPACK (3.4.0 termasuk perbaikan yang disebutkan dalam Catatan Kerja 176)?
Jawaban:
Ada dua masalah yang dihadapi di sini:
Padat atau jarang?
DGEQP3
[Q,R,E] = qr(A)
Apakah Anda memiliki tumpukan perangkat lunak yang sama dengan perpustakaan internal MATLAB?
Mungkin tidak, yang mungkin menjadi salah satu alasan Anda mendapatkan hasil yang berbeda.
Saya mengalami masalah ini ketika unit menguji perpustakaan saya sedang menulis yang menggunakan faktorisasi QR. Saya menggunakan MATLAB untuk membuat prototipe pekerjaan saya dan mendapatkan hasil yang berbeda daripada menggunakan LAPACK atau NumPy. Sejauh yang saya tahu, karena MathWorks tidak membuat informasi ini mudah ditemukan, MATLAB menggunakan versi LAPACK tidak lebih awal dari versi 3.1.1, dan perpustakaan Intel MKL BLAS (untuk Windows, Intel Mac, dan Linux) versi 9.1 atau lebih tinggi (lihat di sini ). Saya tidak dapat menemukan apa pun tentang versi penggunaan MATLAB SuiteSparse. Dengan menggali secara daring atau melihat file perpustakaan untuk sistem Anda, Anda mungkin dapat memperoleh informasi tambahan. Anda dapat mencoba mengubah pustaka yang MATLAB tautkan agar dapat membandingkan dengan pustaka yang sama di seluruh paket perangkat lunak; Eric Chu memberikan tulisan yang bagusyang menunjukkan setidaknya bagaimana Anda dapat mengganti perpustakaan BLAS MATLAB dengan Anda sendiri (tentu saja, Anda melakukan ini dengan risiko Anda sendiri). Dia menyarankan agar Anda dapat melakukan hal yang sama dengan LAPACK juga. Bahkan mungkin untuk mengganti versi SuiteSparse yang digunakan MATLAB dengan versi Anda sendiri.
Saya akhirnya menggunakan NumPy untuk membuat prototipe hasil saya untuk faktorisasi QR, karena menggunakan sistem perpustakaan BLAS dan LAPACK. NumPy dan SciPy bukan pengganti MATLAB, karena kedua pustaka yang digabungkan kekurangan beberapa fungsi MATLAB, tetapi untuk tugas aljabar linier khusus ini, Python + NumPy + SciPy + Matplotlib harus bekerja dengan baik.
sumber
internal.matlab.language.versionPlugins.blas
daninternal.matlab.language.versionPlugins.lapack
mendapatkan versi BLAS dan LAPACKLihat halaman Leslie Foster tentang perangkat lunak yang mengungkapkan peringkat . Lihat juga Catatan Kerja LAPACK
xGEQP3
ini yang menganalisis kegagalan QR pengungkapan peringkat .Anda harus bisa mengetahui rutinitas apa yang digunakan MATLAB dengan mengatur breakpoints dalam debugger dan memeriksa stack. Terakhir saya melihat, diakui beberapa tahun yang lalu, MATLAB menggunakan shared library, dalam hal ini nama simbol tidak dapat dilucuti, sehingga Anda akan melihat nama-nama fungsi pada tumpukan panggilan (tetapi bukan argumen karena itu pasti tidak menyimpan informasi debug).
sumber
xGEQP3
algoritma tidak benar-benar aman untuk mengungkapkan peringkat. Jika Anda ingin menjamin bahwa Anda mendapatkan hasil yang benar, Anda harus menggunakan SVD atau QR yang lebih aman sepertixGEQPX
atauxGEQPY
. Anda tidak dapat mengharapkan algoritma yang tidak stabil untuk mengembalikan hasil yang sama pada arsitektur yang berbeda atau dalam implementasi yang berbeda (MATLAB mungkin menggunakan LAPACK yang lebih tua).