Ich versuche derzeit, eine gute Rangschätzung für eine Matrix billig zu berechnen . Daher berechne ich eine columnt schwenkbare QR-Zerlegung mit
[Q,R,E]=qr(A)
in Matlab. Ich schätze den Rang von mit
tol = size(A,n)*eps*norm(A,'fro');
r = sum(abs(diag(R))>tol)
Dies funktioniert gut und ein Plot über alle diagonalen Einträge von R sieht aus wie:
Wenn der gesamte Algorithmus auf C / Fortran I portiert wird, ersetze ich [Q, R, E] = qr (A) mit DGEQP3 von LAPACK, das auch eine Spalte berechnet, die die QR-Zerlegung schwenkt. Aber wenn ich die gleiche Schätzung für den Rang verwende, verstehe ich meistens etwas falsch. Das gleiche Grundstück für die aus DGEQP3 produziert aussieht
Die Eingabematrix ist für beide Experimente genau gleich.
Meine Frage ist nun, auf welche LAPACK-Funktion sich die spaltenschwenkende QR-Zerlegung von Matlab stützt.
Danke für jede Hilfe, Grisu
Bearbeiten: DGEQPF liefert das gleiche falsche Ergebnis.
Edit2:
- Die Eingabematrix ist dicht und wird als E + s i g n ( E , F ) aufgebaut.
- Ich habe LAPACK 3.4.0 mit OpenBlas / GotoBLAS (64 Bit) verwendet.
- Matlab 7, 2007b, 2010b Linux 32bit
Edit3: - Mit GDB habe ich herausgefunden, dass Matlab 2010b DGEQP3: # 3 0xaa46ce2f in dgeqp3_ () von /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../ aufruft. ./bin/glnx86/mllapack.so Warum erhalte ich mit LAPACK das falsche Ergebnis (3.4.0 einschließlich der in Working Note 176 genannten Korrekturen)?
Antworten:
Hier gibt es zwei Probleme:
Dicht oder spärlich?
DGEQP3
[Q,R,E] = qr(A)
Haben Sie den gleichen Software-Stack wie die internen Bibliotheken von MATLAB?
Wahrscheinlich nicht, was möglicherweise ein Grund dafür ist, dass Sie unterschiedliche Ergebnisse erzielen.
Ich bin auf dieses Problem gestoßen, als ich eine von mir geschriebene Bibliothek mit QR-Faktorisierungen getestet habe. Ich habe MATLAB als Prototyp für meine Arbeit verwendet und andere Ergebnisse erzielt als mit LAPACK oder NumPy. Soweit ich das beurteilen kann, verwendet MATLAB eine Version von LAPACK nicht früher als Version 3.1.1 und Intels MKL BLAS-Bibliothek (für Windows, Intel Mac und Linux), Version 9.1, da MathWorks diese Informationen nicht leicht zu finden macht oder höher (siehe hier ). Ich konnte nichts über die Version von SuiteSparse MATLAB finden. Wenn Sie online stöbern oder die Bibliotheksdateien für Ihr System anzeigen, können Sie möglicherweise zusätzliche Informationen abrufen. Sie können versuchen, die Bibliotheken zu ändern, mit denen MATLAB verknüpft ist, um über Softwarepakete hinweg mit denselben Bibliotheken vergleichen zu können. Eric Chu bietet eine schöne ZusammenfassungDas zeigt zumindest, wie Sie die BLAS-Bibliothek von MATLAB durch Ihre eigene ersetzen können (dies geschieht natürlich auf eigenes Risiko). Er schlägt vor, dass Sie dasselbe auch mit LAPACK tun können. Möglicherweise kann sogar die von MATLAB verwendete Version von SuiteSparse durch Ihre eigene Version ersetzt werden.
Am Ende habe ich NumPy verwendet, um meine Ergebnisse für die QR-Faktorisierung zu prototypisieren, da die System-BLAS- und LAPACK-Bibliotheken verwendet werden. NumPy und SciPy sind kein Ersatz für MATLAB, da den beiden Bibliotheken zusammen einige Funktionen von MATLAB fehlen. Für diese spezielle lineare Algebra-Aufgabe sollte Python + NumPy + SciPy + Matplotlib jedoch gut funktionieren.
quelle
internal.matlab.language.versionPlugins.blas
undinternal.matlab.language.versionPlugins.lapack
BLAS- und LAPACK-Versionen erhaltenSiehe Leslie Fosters Seite über aufschlussreiche Software . Siehe auch diese LAPACK-Arbeitsnotiz zur Analyse von Fehlern bei der Aufdeckung von QR
xGEQP3
.Sie sollten herausfinden können, welche Routinen MATLAB verwendet, indem Sie Haltepunkte in einem Debugger festlegen und den Stapel untersuchen. Zuletzt habe ich vor einigen Jahren zugegeben, dass MATLAB gemeinsam genutzte Bibliotheken verwendet hat. In diesem Fall können die Symbolnamen nicht entfernt werden, sodass Sie die Funktionsnamen auf dem Aufrufstapel sehen (aber keine Argumente, da die Debugging-Informationen definitiv nicht gespeichert werden).
quelle
xGEQP3
Algorithmus ist nicht ganz sicher, um den Rang zu ermitteln. Wenn Sie sicherstellen möchten, dass Sie das richtige Ergebnis erzielen, sollten Sie die SVD oder einen sichereren QR wiexGEQPX
oder verwendenxGEQPY
. Sie können nicht erwarten, dass ein instabiler Algorithmus auf verschiedenen Architekturen oder in verschiedenen Implementierungen dasselbe Ergebnis zurückgibt (MATLAB verwendet wahrscheinlich ein älteres LAPACK).