Ich verwende MATLAB, um ein Problem zu lösen, bei dem zu jedem Zeitpunkt gelöst wird, wobei sich mit der Zeit ändert. Im Moment mache ich das mit MATLABs :mldivide
x = A\b
Ich habe die Flexibilität, so viele Vorberechnungen wie nötig durchzuführen, und frage mich, ob es eine schnellere und / oder genauere Methode als gibt mldivide
. Was wird hier typischerweise gemacht? Vielen Dank an alle!
Antworten:
Das offensichtlichste, was Sie tun können, ist die Vorausberechnung
[L,U] = lu(A)
~ O (n ^ 3)Dann rechnest du einfach
x = U \ (L \ b)
~ O (2 n ^ 2)Dies würde die Kosten enorm senken und beschleunigen. Die Genauigkeit wäre gleich.
quelle
L\b
. Weil ich gesehen habe, dass genau diese Zeile von denjenigen, die ich für Experten halte, im Hochleistungscode verwendet wird.[L,U,p] = lu(A,'vector'); x = U\(L\b(p));
Beispiel 3 in denlu
Dokumenten .Zu diesem Thema haben wir in unseren Kursen zum wissenschaftlichen Rechnen einige umfangreiche Computerlabore durchgeführt. Für die "kleinen" Berechnungen, die wir dort durchgeführt haben, war der Backslash-Operator von Matlab immer schneller als alles andere, auch nachdem wir unseren Code so weit wie möglich optimiert und alle Matrizen zuvor neu angeordnet hatten (zum Beispiel mit der Bestellung von Reverse Cuthill McKee für dünne Matrizen). .
Sie können eine unserer Laboranweisungen lesen . Die Antwort auf Ihre Frage wird (in Kürze) auf Seite 4 behandelt.
Ein gutes Buch zu diesem Thema wurde zum Beispiel von Cheney geschrieben .
quelle
Angenommen, ist eine n × n dichte Matrix und Sie müssen A x i = b i , i = 1 … m lösen . Wenn m ist groß genug , dann gibt es nichts falsch inA n×n Axi=bi i=1…m m
Flops sind für und O ( n 2 ) für , daher sind einige Experimente erforderlich , um den Break-Even-Wert für m zu bestimmen ...O(n3) O(n2) m
inv(A)
V*b
Einige Notizen
Informationen zur Stabilität und Fehleranalyse finden Sie in den Kommentaren zu dieser anderen Antwort , insbesondere der von VictorLiu.
Das Timing wurde mit Matlab R2011b auf einem 12-Kern-Computer mit einem ziemlich konstanten UNIX-Lastdurchschnitt von 5 durchgeführt. beste
tic, toc
Zeit von drei Sonden.quelle
inv(A)
A\B
Werfen Sie einen Blick auf diese Frage , die Antworten zeigen, dass sie
mldivide
ziemlich clever ist, und geben Sie auch Vorschläge, wie Sie sehen können, was Matlab zur Lösung verwendetA\b
. Dies kann Ihnen einen Hinweis zu den Optimierungsoptionen geben.quelle
Die Verwendung von Backslash ist mehr oder weniger gleichbedeutend mit
inv(A)*B
der intuitiven Codierung. Sie sind ungefähr gleich (nur in der Art und Weise, wie die Berechnung durchgeführt wird), obwohl Sie die Matlab-Dokumentation zur Verdeutlichung überprüfen sollten.Um Ihre Frage zu beantworten, ist Backslash im Allgemeinen in Ordnung, es hängt jedoch von den Eigenschaften der Massenmatrix ab.
quelle
inv(A)
da dies allein teurer ist alsA\b
?