Zur Modellreduktion möchte ich die linken Singularvektoren berechnen, die den - sagen wir 20 - größten Singularwerten einer Matrix , wobei und . Leider wird meine Matrix ohne Struktur dicht sein. N ≤ 10 6 k ≤ 10 3 A.
Wenn ich nur die svdRoutine aus dem numpy.linalgModul in Python für eine Zufallsmatrix dieser Größe aufrufe, tritt ein Speicherfehler auf. Dies ist auf die Zuordnung von für die Zerlegung . A = V S U.
Gibt es Algorithmen, die diese Gefahr vermeiden? Zum Beispiel durch Einrichten nur der Singularvektoren, die mit Singularwerten ungleich Null assoziiert sind.
Ich bin bereit, mit Rechenzeit und Genauigkeit zu handeln.
full_matrices, die auf False gesetzt wird, damit nur die Teile ungleich Null berechnet werden. Gibt es dennoch eine Möglichkeit, die Berechnung noch weiter zu reduzieren?
numpyBackend verwendet fortran Code, die LAPACKE_dgesvdRoutine für Standard-DVDs. Normalerweise ist Ihre Matrix jedoch C_CONTIGOUS(überprüfen Sie mit matrix.flags). Daher werden die Daten für die Fortran-Ausrichtung kopiert. Zusätzlich wird beim Ausführen der Lapack-Routine dgesvd eine weitere Kopie Ihrer Matrix benötigt (oder zumindest der Speicher dafür). Sie können eine Kopie entfernen, wenn Sie sicherstellen, dass die Speicherausrichtung von Anfang an im fortran-Stil erfolgt.