Was ist der Grund, warum LAPACK

9

Die QR-Routine von LAPACK speichert Q als Reflektoren für Haushalte. Es skaliert den Reflexionsvektor v mit 1/.v1 , sodass das erste Element des Ergebnisses 1 wird und nicht gespeichert werden muss. Und es speichert einen separaten τ Vektor, der die erforderlichen Skalierungsfaktoren enthält. Eine Reflektormatrix ist also wie folgt:

H.=ich- -τvvT.,

wobei v nicht normalisiert ist. Während in Lehrbüchern die Reflektormatrix ist

H.=ich- -2vvT.,

wo v normalisiert ist.

Warum skaliert LAPACK v mit 1/.v1 , anstatt es zu normalisieren?

Die benötigte Speicherung ist dieselbe (anstelle von τ muss v1 gespeichert werden), und danach kann das Anwenden von H. schneller erfolgen, da keine Multiplikation mit τ erforderlich ist (die Multiplikation mit 2 in der Lehrbuchversion kann optimiert werden, wenn Anstelle einer einfachen Normalisierung wird v mit skaliert2/.v).

(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.)

geza
quelle

Antworten:

7

Es ist die blockierte Variante von Householder-QR, die dieses Design antreibt. Wenn Sie in Golub und Van Loan Buch aussehen (Ch 5.2 oder so) sie sprechen darüber , wie k-Iterationen des Algorithmus kann durch Akkumulieren der einzelnen Reflektoren in einem Rang-k Reflektor der Form zusammen blockiert ich+W.Y.T. , wo sowohl W. als auch Y. sind "hochdünne" Matrizen mit der Größe n×k . Dieser Algorithmus erledigt mehr Arbeit, ist jedoch in der Praxis schneller, da er reich an gemm () -Aufrufen ist. Leider ist es bei der Lagerung verschwenderisch, da W. und Y. unabhängig voneinander dargestellt werden müssen.

In einer späteren Arbeit (unten zitiert) beschreibt Van Loan eine effizientere „symmetrisiert“ Datenstruktur, einen Block Reflektor der Form ich+Y.T.Y.T. . Hier ist Y. immer noch n×k , aber die Flop- / Speicheranforderung zum Bilden von W. wurde durch Einführen von T. , einer kleinen oberen Dreiecksmatrix von k×k beseitigt . Obwohl die Notwendigkeit zu multiplizieren mit T. eine geringe Menge an zusätzlicher Arbeit führt, es ist in der Regel ein Nettogewinn , weil k<<n .

Innerhalb von LAPACK ist der nicht blockierte Algorithmus eigentlich nur ein begrenzender k1 Fall des Blockalgorithmus bis hin zur Auswahl der Symbole (was uns zu τ , einer kleinen 1×1 Version des T. Dreiecks).

Zitat: Schreiber, Robert und Charles Van Loan. "Eine speichereffiziente WY-Darstellung für Produkte von Householder-Transformationen." SIAM Journal on Scientific and Statistical Computing 10.1 (1989): 53-57.

rchilton1980
quelle
Danke für die Antwort! Ich sehe nicht, dass nur ein T mit 1 × 1- Größe ist . In dem zitierten Papier, in Algorithm 5, Y ist v und T -2 ist . Es endet also als Lehrbuchversion, nicht als LAPACK-Version. Vermisse ich etwas τ1×1T.Y.vT.
Geza
2

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 von R. 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.

Federico Poloni
quelle
1

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.

VorKir
quelle