Procedura QR LAPACK przechowuje Q jako reflektory Householdera. Skaluje wektor odbicia pomocą , więc pierwszy element wyniku staje się , więc nie trzeba go przechowywać. I przechowuje osobny wektor , który zawiera potrzebne współczynniki skali. Zatem macierz reflektorów jest taka:
gdzie nie jest znormalizowane. Natomiast w podręcznikach matryca reflektorów jest
gdzie jest znormalizowane.
Dlaczego skala LAPACK z , zamiast normalizowania go?
Potrzebne miejsce jest takie samo (zamiast , należy zapisać ), a następnie zastosowanie można wykonać szybciej, ponieważ nie ma potrzeby mnożenia przez (mnożenie przez w wersji podręcznika można zoptymalizować, jeśli zamiast prostej normalizacji, jest skalowane przez ).
(Powodem mojego pytania jest to, że piszę procedurę QR i SVD i chciałbym poznać przyczynę tej decyzji, czy muszę ją przestrzegać, czy nie)
źródło
Nie musisz przechowywaćτ , możesz ponownie obliczyć go z pozostałej części wektora. (Możesz ponownie obliczyćv1 z innych pozycji również w znormalizowanej wersji, ale jest to wyraźnie niestabilne obliczenie z powodu tych odejmowań).
W rzeczywistości możesz ponownie użyć dolnej trójkątnej częściR przechować v2,...vn , aby faktoryzacja została obliczona w pełni na miejscu. Lapack bardzo dba o te lokalne wersje algorytmów.
źródło
Moja sugestia jest oparta na dokumentacji dla Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Wygląda jak wartości na przekątnej magazynu wyjściowego R i powyżej, więc dla Q pozostaje tylko niższy trójkąt. Naturalnym wydaje się wykorzystanie dodatkowej pamięci dla czynników skalujących.
źródło