QR rutin LAPACK menyimpan Q sebagai reflektor rumah tangga. Ini skala vektor refleksi dengan , jadi elemen pertama hasilnya menjadi , sehingga tidak harus disimpan. Dan itu menyimpan vektor terpisah , yang berisi faktor skala yang diperlukan. Jadi matriks reflektor adalah seperti ini:
di mana tidak dinormalisasi. Sementara, dalam buku teks, matriks reflektor adalah
di mana dinormalisasi.
Mengapa LAPACK berskala dengan , alih-alih menormalkannya?
Penyimpanan yang dibutuhkan sama (bukan , harus disimpan), dan setelah itu, menerapkan dapat dilakukan lebih cepat, karena tidak perlu mengalikan dengan (perkalian dengan dalam versi buku teks dapat dioptimalkan, jika alih-alih normalisasi sederhana, diskalakan oleh ).
(Alasan pertanyaan saya adalah saya menulis rutin QR dan SVD, dan saya ingin tahu alasan keputusan ini, apakah saya perlu mengikutinya atau tidak)
sumber
Anda tidak harus menyimpan , Anda dapat menghitung ulang dari sisa vektor. (Anda dapat menghitung ulang dari entri lain juga dalam versi yang dinormalkan, tetapi jelas merupakan perhitungan yang tidak stabil karena pengurangan tersebut.)τ v1
Sebenarnya, Anda dapat menggunakan kembali bagian segitiga-bawah untuk menyimpan , sehingga faktorisasi dikomputasi sepenuhnya di tempat. Lapack sangat peduli dengan versi algoritma ini.R v2,...vn
sumber
Saran saya didasarkan pada dokumentasi untuk Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Sepertinya nilai-nilai pada dan di atas diagonal dari toko keluaran R sehingga hanya ada segitiga bawah yang tersisa untuk Q. Tampaknya alami untuk menggunakan penyimpanan tambahan untuk faktor penskalaan.
sumber