Möglicherweise möchten Sie die dunkelere Matlab-Funktion bsxfun . In der Matlab-Dokumentation wendet bsxfun "die vom Funktionshandle fun angegebene Element-für-Element-Binäroperation auf Arrays A und B an, wobei die Singleton-Erweiterung aktiviert ist."
@gnovice hat oben angegeben, dass sum und andere Grundfunktionen bereits für die erste Nicht-Singleton-Dimension ausgeführt werden (dh Zeilen, wenn mehr als eine Zeile vorhanden ist, Spalten, wenn nur eine Zeile vorhanden ist, oder höhere Dimensionen, wenn alle niedrigeren Dimensionen die Größe == 1 haben ). Bsxfun funktioniert jedoch für jede Funktion, einschließlich (und insbesondere) benutzerdefinierter Funktionen.
Angenommen, Sie haben eine Matrix A und einen Zeilenvektor BEg. Nehmen wir an:
A = [1 2 3;
4 5 6;
7 8 9]
B = [0 1 2]
Sie möchten eine Funktion power_by_col, die in einem Vektor C alle Elemente in A auf die Potenz der entsprechenden Spalte von B zurückgibt.
Aus dem obigen Beispiel ist C eine 3x3-Matrix:
C = [1^0 2^1 3^2;
4^0 5^1 6^2;
7^0 8^1 9^2]
dh
C = [1 2 9;
1 5 36;
1 8 81]
Sie können dies auf Brute-Force-Weise mit repmat tun:
C = A.^repmat(B, size(A, 1), 1)
Oder Sie können dies auf klassische Weise mit bsxfun tun, das sich intern um den Repmat-Schritt kümmert:
C = bsxfun(@(x,y) x.^y, A, B)
Bsxfun erspart Ihnen also einige Schritte (Sie müssen die Abmessungen von A nicht explizit berechnen). In einigen meiner informellen Tests hat sich jedoch herausgestellt, dass repmat ungefähr doppelt so schnell ist, wenn die anzuwendende Funktion (wie meine Power-Funktion oben) einfach ist. Sie müssen sich also entscheiden, ob Sie Einfachheit oder Geschwindigkeit wünschen.