Viele eingebaute Operationen mögen sum
undprod
bereits zeilen- oder spaltenübergreifend ausgeführt werden, sodass Sie möglicherweise die von Ihnen angewendete Funktion umgestalten können, um dies zu nutzen.
Wenn dies keine praktikable Option ist, besteht eine Möglichkeit darin, die Zeilen oder Spalten mit mat2cell
oder in Zellen zu sammeln num2cell
und dann cellfun
das resultierende Zellenarray zu bearbeiten.
Angenommen, Sie möchten die Spalten einer Matrix summieren M
. Sie können dies einfach tun mit sum
:
M = magic(10); %# A 10-by-10 matrix
columnSums = sum(M, 1); %# A 1-by-10 vector of sums for each column
Und hier ist, wie Sie dies mit der komplizierteren num2cell
/ cellfun
Option tun würden :
M = magic(10); %# A 10-by-10 matrix
C = num2cell(M, 1); %# Collect the columns into cells
columnSums = cellfun(@sum, C); %# A 1-by-10 vector of sums for each cell
true = false
eine gültige Aussagesum(M, 1)
. Anfänger könnten denken,sum
dass sie auf diese Weise für Matrizen beliebiger Größe verwendet werden können und dann ratlos werden, wenn die Matrix eines Tages ist1-by-n
.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:
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:
dh
Sie können dies auf Brute-Force-Weise mit repmat tun:
Oder Sie können dies auf klassische Weise mit bsxfun tun, das sich intern um den Repmat-Schritt kümmert:
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.
quelle
Ich kann nicht sagen, wie effizient dies ist, aber hier ist eine Lösung:
quelle
Aufbauend auf Alex 'Antwort ist hier eine allgemeinere Funktion:
Hier ist ein Vergleich zwischen den beiden Funktionen:
quelle
Der Vollständigkeit halber möchte ich hinzufügen, dass matlab eine Funktion hat, mit der Sie Daten pro Zeile und nicht pro Element bearbeiten können. Es heißt
rowfun
( http://www.mathworks.se/help/matlab/ref/rowfun.html ), aber das einzige "Problem" ist, dass es mit Tabellen arbeitet ( http://www.mathworks.se/help/). matlab / ref / table.html ) statt Matrizen .quelle
Zusätzlich zur Entwicklung der Antwort auf diese Frage, beginnend mit r2016b, wird MATLAB die Singleton-Dimensionen implizit erweitern und
bsxfun
in vielen Fällen die Notwendigkeit beseitigen .Aus den Versionshinweisen zu r2016b :
quelle
Keine der oben genannten Antworten hat für mich "out of the box" funktioniert, jedoch funktioniert die folgende Funktion, die durch Kopieren der Ideen der anderen Antworten erhalten wird:
Es nimmt eine Funktion an
f
und wendet sie auf jede Spalte der Matrix anM
.Also zum Beispiel:
quelle
Mit neueren Versionen von Matlab können Sie die Tabellendatenstruktur zu Ihrem Vorteil nutzen. Es gibt sogar eine "Rowfun" -Operation, aber ich fand es einfacher, dies einfach zu tun:
oder hier ist eine ältere, für die ich keine Tabellen benötige, für ältere Matlab-Versionen.
quelle
Die akzeptierte Antwort scheint darin zu bestehen, zuerst in Zellen umzuwandeln und dann
cellfun
über alle Zellen zu operieren. Ich kenne die spezifische Anwendung nicht, aber im Allgemeinen würde ich denken, dass die Verwendungbsxfun
zum Überarbeiten der Matrix effizienter wäre. Grundsätzlich wirdbsxfun
eine Operation Element für Element auf zwei Arrays angewendet. Wenn Sie also jedes Element in einemn x 1
Vektor mit jedem Element in einemm x 1
Vektor multiplizieren möchten , um einn x m
Array zu erhalten, können Sie Folgendes verwenden:Dies gibt Ihnen eine Matrix namens,
result
wobei der (i, j) -Eintrag das i-te Element vonvec1
multipliziert mit dem j-ten Element von istvec2
.Sie können
bsxfun
für alle Arten von integrierten Funktionen verwenden und Ihre eigenen deklarieren. Die Dokumentation enthält eine Liste vieler integrierter Funktionen. Grundsätzlich können Sie jedoch jede Funktion benennen, die zwei Arrays (Vektor oder Matrix) als Argumente akzeptiert, und sie zum Laufen bringen.quelle
Stolperte über diese Frage / Antwort, während ich suchte, wie man die Zeilensummen einer Matrix berechnet.
Ich möchte nur hinzufügen, dass die SUM-Funktion von Matlab tatsächlich die Summierung für eine bestimmte Dimension unterstützt, dh eine Standardmatrix mit zwei Dimensionen.
Um die Spaltensummen zu berechnen, gehen Sie wie folgt vor:
und für die Zeilensummen einfach tun
Meine Wette ist, dass dies schneller ist als das Programmieren einer for-Schleife und das Konvertieren in Zellen :)
All dies finden Sie in der Matlab-Hilfe für SUM.
quelle
Wenn Sie die Länge Ihrer Zeilen kennen, können Sie Folgendes tun:
quelle