Die QR-Routine von LAPACK speichert Q als Reflektoren für Haushalte. Es skaliert den Reflexionsvektor mit , sodass das erste Element des Ergebnisses wird und nicht gespeichert werden muss. Und es speichert einen separaten Vektor, der die erforderlichen Skalierungsfaktoren enthält. Eine Reflektormatrix ist also wie folgt:
wobei nicht normalisiert ist. Während in Lehrbüchern die Reflektormatrix ist
wo normalisiert ist.
Warum skaliert LAPACK mit , anstatt es zu normalisieren?
Die benötigte Speicherung ist dieselbe (anstelle von muss gespeichert werden), und danach kann das Anwenden von schneller erfolgen, da keine Multiplikation mit erforderlich ist (die Multiplikation mit in der Lehrbuchversion kann optimiert werden, wenn Anstelle einer einfachen Normalisierung wird mit √ skaliert).
(Der Grund meiner Frage ist, dass ich eine QR- und SVD-Routine schreibe und ich möchte den Grund für diese Entscheidung wissen, ob ich sie befolgen muss oder nicht.)
quelle
Sie müssenτ nicht speichern , sondern können es aus dem Rest des Vektors neu berechnen. (Sie können v1 aus den anderen Einträgen auch in der normalisierten Version neu berechnen, aber aufgrund dieser Subtraktionen ist dies eindeutig eine instabile Berechnung.)
Tatsächlich können Sie den unteren dreieckigen Teil vonR. wiederverwenden , um v2, . . . vn , so dass die Faktorisierung vollständig an Ort und Stelle berechnet wird. Lapack kümmert sich sehr um diese In-Place-Versionen von Algorithmen.
quelle
Mein Vorschlag basiert auf der Dokumentation für Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Es sieht aus wie die Werte auf und über der Diagonale des Ausgabespeichers R, so dass für Q nur noch ein unteres Dreieck übrig ist. Es erscheint natürlich, zusätzlichen Speicher für die Skalierungsfaktoren zu verwenden.
quelle