MATLAB: Extrahiere mehrere Teile einer Matrix, ohne Schleifen zu verwenden

8

Ich habe eine riesige 2D-Matrix und möchte 15 verschiedene 100x100 Teile daraus extrahieren. Ich habe zwei Vektoren x und y, wo die oberen linken Indizes der Teile gespeichert werden. Ich habe so etwas benutzt:

%Vor%

aber das Ergebnis ist nur eine 100x100-Matrix anstelle von 15x100x100. Warum?

Ich weiß, dass es leicht mit einer Schleife gemacht werden kann, aber wir dürfen keine Schleifen verwenden (es ist Teil einer Bildverarbeitungsübung). Eine andere Möglichkeit wäre, alle 15 Zeilen zu schreiben, aber das ist irgendwie hässlich.

Haben Sie eine elegante Lösung? Danke.

    
Coral Doe 25.05.2009, 09:42
quelle

3 Antworten

6

Es gibt eine Reihe von Möglichkeiten, wie Sie dies ohne Schleifen tun können. Die meisten Lösungen beinhalten das Erweitern der Vektoren x und y in größere Matrizen von Indizes und würden wahrscheinlich eine oder mehrere der Funktionen REPMAT , BSXFUN oder SUB2IND . Ein gutes Tutorial zur Matrix-Indizierung finden Sie hier .

Da Sie jedoch nach einer eleganten Lösung gefragt haben, ist dies etwas ungewöhnlich. Es verwendet anonyme Funktionen sowie die Funktionen ARRAYFUN und CAT :

%Vor%

ERKLÄRUNG:

Die erste Zeile erstellt eine anonyme Funktion . Dies ist eine einfache Ein-Zeilen-Funktion, die im Handumdrehen erstellt werden kann, ohne sie in eine M-Datei schreiben zu müssen. Die Funktion definiert zwei Eingaben r und c , die verwendet werden, um eine 100-mal-100-Submatrix aus cam1 zu extrahieren. Die Variable indexFcn speichert eine Funktionskennung verwendet, um die Funktion aufzurufen. Beachten Sie, dass die von der anonymen Funktion verwendeten Werte von cam1 static sind. Auch wenn sich die Werte in der Variablen cam1 ändern, verwendet die anonyme Funktion weiterhin die Werte, die beim Erstellen der Funktion in cam1 vorhanden waren.

Die zweite Zeile ruft ARRAYFUN auf, die eine Funktion auf jedes Element eines Arrays anwendet. ARRAYFUN führt eine Schleife über jeden Eintrag in x und y aus und übergibt die Werte an indexFcn . Die Ausgabe wird in result gespeichert, einem Zellenfeld mit 15 Elementen, wobei jede Zelle eine 100-mal-100-Matrix enthält.

Die dritte Zeile verwendet die CAT-Funktion, um die 100-mal-100-Matrizen zu einer 100-mal-100-mal-15-Matrix zu verketten.

    
gnovice 25.05.2009, 17:57
quelle
4

Da dies offensichtlich Hausaufgaben sind, werde ich Ihnen nicht die vollständige Antwort geben.

Es gibt mehrere Möglichkeiten, in eine Matrix zu indizieren. Wenn Sie einen verstreuten Index festgelegt haben, müssen Sie einen einzelnen Index verwenden. Also wenn

%Vor%

ergibt eine 2x2-Submatrix von A. Aber wir können diese Submatrix auch als

finden %Vor%

Warum habe ich diesen Indexsatz gewählt? Für die Antwort müssen Sie über sub2ind lesen.

%Vor%

Am Ende sieht es so aus, als ob Sie ein 15x100x100 Array aus den extrahierten Teilen haben möchten. Also baue aus den gezeigten Teilen das notwendige Index-Array auf. Sie müssen am Ende eine letzte Umformung vornehmen, um die richtige Form zu erhalten.

Dies sollte Ihnen genug von einem Anfang geben, um Ihre Hausaufgaben zu beenden.

    
user85109 25.05.2009 13:30
quelle
0

Sie denken, alles zu schwierig, versuchen Sie diesen: mat2cell

    
zp3 22.06.2012 00:06
quelle

Tags und Links