MRDIVIDE oder der Operator %code% löst tatsächlich das lineare System %code% als im Gegensatz zu MLDIVIDE oder dem Operator %code% , der das System %code% löst.
Um ein System %code% mit einer unsymmetrischen, nicht invertierbaren Matrix %code% zu lösen, können Sie sich entweder auf %code% verlassen, was über die Faktorisierung von %code% mit Gauss Elimination oder %code% geschieht. Dies geschieht über die Singular Value Decomposition und das Zero-Sing der Singulärwerte unterhalb einer (Default-) Toleranzgrenze.
Hier ist der Unterschied (für den Fall %code% ): Was ist der Unterschied zwischen PINV und MLDIVIDE, wenn ich A * x = b löse?
Wenn das System überbestimmt ist, liefern beide Algorithmen die gleiche Antwort. Wenn das System unterbestimmt ist, gibt PINV die Lösung x, die die Mindestnorm hat (min NORM (x)). MLDIVIDE wird Wählen Sie die Lösung mit der geringsten Anzahl von Nicht-Null-Elementen.
In Ihrem Beispiel:
%Vor%das System ist unterbestimmt, und die zwei verschiedenen Lösungen werden sein:
%Vor%In beiden Fällen ist der Approximationsfehler von %code% nicht vernachlässigbar (nicht exakte Lösung) und dasselbe, d. h. %code% und %code% werden das gleiche Ergebnis liefern.
Was macht MATLAB?
In diesem Beitrag in scicomp.stackexchange.com . Ich gehe davon aus, dass ähnliche Optionen für den Operator %code% gelten.
Für Ihr Beispiel wird MATLAB höchstwahrscheinlich eine Gauß-Eliminierung durchführen, die die einfachste Lösung unter einer Unendlichkeit ergibt (da kommt die 5 her).
Was macht Python?
Python, in %code% verwendet pseudoinverse / SVD, wie oben gezeigt (deshalb erhalten Sie einen Vektor von 0.2). Im Endeffekt erhalten Sie mit dem folgenden Befehl das gleiche Ergebnis wie in %code% von MATLAB:
%Vor%Ich habe diese Zeile des MATLAB-Codes:
%Vor%Ich verwende diese Eingaben:
%Vor%Dies ist das Ergebnis (eine 1x25-Matrix):
%Vor%Was macht MATLAB? Ich versuche, dieses Verhalten in Python zu kopieren, und die %code% -Dokumentation in MATLAB war nicht hilfreich. Woher kommt die 5 und warum sind die restlichen Werte 0?
Ich habe dies mit anderen Eingaben versucht und ähnliche Ergebnisse erhalten, normalerweise nur ein anderes erstes Element und Nullen, die den Rest der Matrix füllen. In Python, wenn ich %code% verwende, sind alle Werte in der ersten zurückgegebenen Matrix (d. H. Nicht die Einzahl) 0,2. Ich habe schon in Python die richtige Aufteilung versucht und es gibt etwas komplett mit den falschen Dimensionen aus.
Ich verstehe, was eine Approximation kleinster Quadrate ist, ich muss nur wissen, was %code% macht.
Per dieses handliche "Spickzettel" von numpy für Matlab Benutzer %code% - %code% numpy.linalg.linalg , eine leichtgewichtige Version des vollen %code% .
a / b findet die Lösung des kleinsten Quadrats für das lineare Gleichungssystem bx = a
Wenn b invertierbar ist, ist dies a * inv (b), aber wenn es nicht ist, ist es das x, das norm (bx-a)
minimiertSie können mehr über die kleinsten Quadrate auf wikipedia .
nach matlab documentation , mrdivide liefert höchstens k Werte ungleich null, wobei k der berechnete Rang von b ist. Meine Vermutung ist, dass Matlab in Ihrem Fall das Problem der kleinsten Quadrate löst, das durch Ersetzen von b durch b (: 1) (das den gleichen Rang hat) gegeben ist. In diesem Fall wird die moore-penrose inverse %code% definiert und gibt die gleiche Antwort
Ich habe diese Zeile des MATLAB-Codes:
%Vor%Ich verwende diese Eingaben:
%Vor%Dies ist das Ergebnis (eine 1x25-Matrix):
%Vor% Was macht MATLAB? Ich versuche, dieses Verhalten in Python zu kopieren, und die mrdivide
-Dokumentation in MATLAB war nicht hilfreich. Woher kommt die 5 und warum sind die restlichen Werte 0?
Ich habe dies mit anderen Eingaben versucht und ähnliche Ergebnisse erhalten, normalerweise nur ein anderes erstes Element und Nullen, die den Rest der Matrix füllen. In Python, wenn ich linalg.lstsq(b.T,a.T)
verwende, sind alle Werte in der ersten zurückgegebenen Matrix (d. H. Nicht die Einzahl) 0,2. Ich habe schon in Python die richtige Aufteilung versucht und es gibt etwas komplett mit den falschen Dimensionen aus.
Ich verstehe, was eine Approximation kleinster Quadrate ist, ich muss nur wissen, was mrdivide
macht.
MRDIVIDE oder der Operator /
löst tatsächlich das lineare System xb = a
als im Gegensatz zu MLDIVIDE oder dem Operator \
, der das System bx = a
löst.
Um ein System xb = a
mit einer unsymmetrischen, nicht invertierbaren Matrix b
zu lösen, können Sie sich entweder auf mridivide()
verlassen, was über die Faktorisierung von b
mit Gauss Elimination oder pinv()
geschieht. Dies geschieht über die Singular Value Decomposition und das Zero-Sing der Singulärwerte unterhalb einer (Default-) Toleranzgrenze.
Hier ist der Unterschied (für den Fall mldivide
): Was ist der Unterschied zwischen PINV und MLDIVIDE, wenn ich A * x = b löse?
Wenn das System überbestimmt ist, liefern beide Algorithmen die gleiche Antwort. Wenn das System unterbestimmt ist, gibt PINV die Lösung x, die die Mindestnorm hat (min NORM (x)). MLDIVIDE wird Wählen Sie die Lösung mit der geringsten Anzahl von Nicht-Null-Elementen.
In Ihrem Beispiel:
%Vor%das System ist unterbestimmt, und die zwei verschiedenen Lösungen werden sein:
%Vor% In beiden Fällen ist der Approximationsfehler von xb-a
nicht vernachlässigbar (nicht exakte Lösung) und dasselbe, d. h. norm(x1*b-a)
und norm(x2*b-a)
werden das gleiche Ergebnis liefern.
Was macht MATLAB?
In diesem Beitrag in scicomp.stackexchange.com . Ich gehe davon aus, dass ähnliche Optionen für den Operator /
gelten.
Für Ihr Beispiel wird MATLAB höchstwahrscheinlich eine Gauß-Eliminierung durchführen, die die einfachste Lösung unter einer Unendlichkeit ergibt (da kommt die 5 her).
Was macht Python?
Python, in linalg.lstsq
verwendet pseudoinverse / SVD, wie oben gezeigt (deshalb erhalten Sie einen Vektor von 0.2). Im Endeffekt erhalten Sie mit dem folgenden Befehl das gleiche Ergebnis wie in pinv()
von MATLAB:
a / b findet die Lösung des kleinsten Quadrats für das lineare Gleichungssystem bx = a
Wenn b invertierbar ist, ist dies a * inv (b), aber wenn es nicht ist, ist es das x, das norm (bx-a)
minimiertSie können mehr über die kleinsten Quadrate auf wikipedia .
nach matlab documentation , mrdivide liefert höchstens k Werte ungleich null, wobei k der berechnete Rang von b ist. Meine Vermutung ist, dass Matlab in Ihrem Fall das Problem der kleinsten Quadrate löst, das durch Ersetzen von b durch b (: 1) (das den gleichen Rang hat) gegeben ist. In diesem Fall wird die moore-penrose inverse b2 = b(1,:); inv(b2*b2')*b2*a'
definiert und gibt die gleiche Antwort
Per dieses handliche "Spickzettel" von numpy für Matlab Benutzer linalg.lstsq(b,a)
- linalg
numpy.linalg.linalg , eine leichtgewichtige Version des vollen scipy.linalg
.
Tags und Links python matlab linear-algebra numpy