Was ist der beste Weg, um Spalten einer Matrix in MATLAB zu durchlaufen?

8

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?

    
dmnd 07.06.2009, 01:00
quelle

6 Antworten

3

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.

    
Mr Fooz 09.11.2008, 07:30
quelle
10

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.

    
Tim Whitcomb 23.10.2008 18:17
quelle
2

Vielleicht könntest du die Matrix immer mit dem 'Operator transformieren und dann das Ergebnis zurücktransformieren.

%Vor%

Das funktioniert zumindest mit der fft-Funktion.

    
Hallgrim 19.10.2008 15:05
quelle
1

Vergessen Sie nicht, die Ergebnismatrix vorzubelegen, wenn Sie mit großen Matrizen arbeiten. Andernfalls wird Ihre CPU viele Zyklen aufwenden, um die Matrix bei jedem Hinzufügen einer neuen Zeile / Spalte neu zuzuweisen.

    
Jason S 10.12.2008 18:11
quelle
1

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

    
user85109 11.04.2009 02:34
quelle
0

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.

    
bastibe 19.10.2008 14:15
quelle

Tags und Links