Ich möchte eine Funktion auf alle Spalten in einer Matrix mit MATLAB anwenden. Zum Beispiel möchte ich in der Lage sein, jede Spalte einer Matrix glatt aufzurufen, anstatt die Matrix glatt als Vektor zu behandeln (was das Standardverhalten ist, wenn Sie glatt (Matrix) aufrufen).
Ich bin mir sicher, dass es einen idiomatischen Weg dafür geben muss, aber ich kann es nicht finden, also habe ich eine map_column Funktion definiert:
%Vor%was ich anrufen kann:
%Vor%Stimmt irgendetwas mit diesem Code nicht? Wie könnte ich es verbessern?
Ihre Lösung ist in Ordnung.
Beachten Sie, dass horizcat eine erhebliche Leistungseinbuße für große Matrizen erzwingt. Es macht den Code O (N ^ 2) statt O (N). Für eine 100x10.000-Matrix benötigt Ihre Implementierung 2.6s auf meinem Computer, der horizocat 64.5s. Für eine 100x5000-Matrix benötigt die horizcat-Implementierung 15.7s.
Wenn Sie möchten, können Sie Ihre Funktion etwas verallgemeinern und sie über die letzte Dimension oder sogar über beliebige Dimensionen (nicht nur Spalten) durchlaufen lassen.
Die MATLAB "for" -Anweisung führt eine Schleife über die Spalten von allem durch, was geliefert wird - normalerweise führt dies nur zu einer Folge von Skalaren, da der Vektor (wie in obigem Beispiel) ein Zeilenvektor ist. Dies bedeutet, dass Sie den obigen Code wie folgt umschreiben können:
%Vor%Wenn func keinen Spaltenvektor zurückgibt, können Sie etwas hinzufügen wie
%Vor%um es in eine Spalte zu zwingen.
Eine Möglichkeit, eine implizite Schleife über die Spalten einer Matrix hinweg zu verursachen, ist cellfun. Das heißt, Sie müssen zuerst die Matrix in ein Zellenfeld konvertieren, jede Zelle enthält eine Spalte. Dann ruf cellfun an. Zum Beispiel:
A = randn (10,5);
Sehen Sie, dass ich hier die Standardabweichung für jede Spalte berechnet habe.
cellfun (@ std, mat2cell (A, Größe (A, 1), Einser (1, Größe (A, 2))))
ans = 0.78681 1.1473 0.89789 0.66635 1.3482
Natürlich sind viele Funktionen in MATLAB bereits so eingerichtet, dass sie in Zeilen oder Spalten eines Arrays arbeiten, wie der Benutzer angibt. Dies gilt natürlich auch für die Std., Aber dies ist ein praktischer Weg zu testen, dass cellfun erfolgreich funktioniert hat.
std (A, [], 1)
ans = 0.78681 1.1473 0.89789 0.66635 1.3482
Wenn dies ein häufiger Anwendungsfall für Ihre Funktion ist, wäre es vielleicht eine gute Idee, dass die Funktion automatisch durch die Spalten iteriert, wenn die Eingabe kein Vektor ist.
Dies löst nicht genau Ihr Problem, aber es würde die Verwendung der Funktionen vereinfachen. In diesem Fall sollte die Ausgabe auch eine Matrix sein.
Sie können die Matrix auch in eine lange Spalte transformieren, indem Sie m(:,:) = m(:)
verwenden. Es hängt jedoch von Ihrer Funktion ab, ob dies sinnvoll ist.
Tags und Links enumeration matlab