Immer Verwenden Sie Matrixmultiplikation oder irgendetwas, das sich mit Matrizen oder Vektoren in einem linearen Algebra-Kontext beschäftigt. Insbesondere, wenn Sie alles berechnen können, was Sie mit linearer Algebra berechnen müssen (eine Kombination aus Addition, Subtraktion, Multiplikation usw. auf Matrizen), dann tun Sie es. Der Grund, warum MATLAB erstellt wurde, war, Operationen mit linearer Algebra so schnell wie möglich durchzuführen. Mit sum
wäre sicherlich langsamer. Zum Beispiel, sieh diesen Beitrag: fast matrix multiplication in Matlab
Dieser Beitrag bietet auch Einblick: Matlab matrix multiplication speed. MATLAB führt auch dieses Multithreading durch und ist stark für mehrere Kerne optimiert.
Wenn Sie einen Test möchten, lassen Sie sich den leichten Fall angehen (Gleichung 1), wo wir sehen können, dass Sie entweder sum
oder Matrixmultiplikation verwenden können diese Menge zu berechnen. Sie können J
berechnen auch mit Matrixmultiplikation mit:
d = X*theta - y;
J = 1/(2*m)*(d.'*d);
Die oben verwendet die Definition des Skalarprodukts die Summe der quadrierten Differenzen zu berechnen, die Matrix-Multiplikation berechnet werden kann mit dem X*theta - y
als m x 1
Matrix betrachtet wird. Mit dem Obigen rechnen Sie speziell die Kostenfunktion für die lineare Regression, die durch Gradientenabstieg minimiert werden soll. Lassen Sie uns einen ziemlich großen Parametervektor für theta
zu 100 x 1 erstellen, und eine Datenmatrix zu 10000000 x 100
, wo wir 10 Millionen Datenpunkte zu 100 Parametern haben. Ich habe viel RAM auf meinem Computer, so dass Sie diesen Test möglicherweise nicht ausführen können. Ich werde diese auch alle auf Zufallszahlen initialisieren und einen Seed setzen, um die Reproduzierbarkeit sicherzustellen. Lassen Sie uns timeit
verwenden und sehen, wie lange diese beiden dauern werden.Dies ist eine Testfunktion, die ich schrieb:
function test_grad
rng(123);
theta = rand(100,1);
X = rand(1e7, 100);
y = rand(1e7, 1);
m = size(X, 1);
function test1
out = 1/(2*m) * sum((X*theta - y).^2);
end
function test2
d = X*theta - y;
out = 1/(2*m)*(d.'*d);
end
t1 = timeit(@test1);
t2 = timeit(@test2);
fprintf('The timing for sum: %f seconds\n', t1);
fprintf('The timing for matrix multiplication: %f seconds\n', t2);
end
Wenn Sie diese Funktion in MATLAB laufen, tut es umfangreiche Tests zwischen sum
mit und Matrixmultiplikation verwenden.
Dies ist, was ich bekomme, wenn ich diese Funktion ausführen. Ich habe 16 GB RAM auf einem MacBook Pro mit einem i7 Intel Core 2,3 GHz Prozessor:
>> test_grad
The timing for sum: 0.594337 seconds
The timing for matrix multiplication: 0.393643 seconds
Wie Sie sehen können, Matrixmultiplikation (zumindest auf meinem Rechner) eine 0,2 Sekunden Differenz im Durchschnitt für jeden Lauf mit timeit
.
tl;dr
: Wenn Sie Matrixmultiplikation verwenden können, es zu tun. Es ist der schnellste, mit dem Sie Ihren Code laufen lassen können.
Nicht sicher, Ihre Frage perfekt zu verstehen, und das Wissen der Dimensionen der Variablen in den Begriffen Ihrer codierten Gleichungen würde helfen. Abgesehen davon enthalten einige Matrixmultiplikationsregeln einige Summierungen ihrer Zwischenterme. Matlab hat nichts zu tun, nur die Mathematikregeln. Jede Software, die Matrixmultiplikationsfunktionen anbietet, sollte diese Regeln enthalten (wie es Matlab tut). – Hoki
Ihre Bearbeitung ist unklar. Ich weiß nicht, was du fragst. – rayryeng
Danke für die ursprüngliche Antwort und die Notiz! Ich versuche allgemeine Heuristiken für _translating Gleichungen zu code_ zu entwickeln. In dieser speziellen Frage ging es darum, eine Gleichung mit einer _summation_ -Funktion in _Matlab_ zu implementieren. Basierend auf Ihrem Code unten sieht es so aus, als ob ich für beide Funktionen sum() nicht verwenden müsste. Dein Code (hier kopiert) hätte funktioniert. 'd = X * Theta - y;' 'J = 1/(2 * m) * (d. '* D);' – stevemuse