MATLAB: Extrahieren Sie mehrere Teile einer matrix ohne Verwendung von Schleifen
Ich habe eine riesige 2D-matrix-und das würde ich gerne extrahieren, 15 verschiedene 100x100 Teile aus ihm heraus. Ich habe zwei Vektoren x und y der linken oberen Indizes die Teile gespeichert werden. Ich habe verwendet, so etwas wie dieses:
result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99));
aber das Ergebnis ist einfach nur eine 100x100 matrix statt eines 15x100x100. Warum?
Ich weiß, es könnte leicht getan werden, mithilfe einer Schleife, aber wir sind nicht erlaubt die Verwendung von loops (es ist Teil einer image-processing-übung). Eine andere Möglichkeit wäre zu schreiben alle 15 Zeilen, aber das ist sowas von hässlich.
Haben Sie eine elegante Lösung? Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Reihe von Möglichkeiten, wie Sie dies tun könnte, ohne zu Schleifen. Die meisten Lösungen beinhalten die Erweiterung der Vektoren x und y in größere Matrizen der Indizes und würde wahrscheinlich verwenden Sie eine oder mehrere der Funktionen REPMAT, BSXFUN, oder SUB2IND. Eine gute Anleitung für matrix-Indizierung finden hier.
Jedoch seit Ihr gefragt für eine elegante Lösung, hier ist eine, die ist etwas ungewöhnlich. Es nutzt anonyme Funktionen sowie die Funktionen ARRAYFUN und KATZE:
ERKLÄRUNG:
Die erste Zeile erzeugt eine anonyme Funktion. Dies ist eine einfache einzeilige Funktion, die erstellt werden können on-the-fly, ohne dass es in einer m-Datei. Die Funktion legt zwei Eingänge r und c, die verwendet werden, zu extrahieren, eine 100-by-100 submatrix von cam1. Die variable indexFcn speichert eine function handle, die verwendet wird, um die Funktion aufzurufen. Beachten Sie, dass die Werte der cam1 verwendet, die von der anonymen Funktion sind statische. Auch wenn die Werte in der variable cam1 ändern, wird die anonyme Funktion verwendet immer noch die Werte, die in cam1, wenn die Funktion erstellt wurde.
In der zweiten Zeile einen Aufruf von ARRAYFUN, der wendet eine Funktion auf jedes element eines Arrays. ARRAYFUN Schleifen über jeden Eintrag in x und y, die übergabe der Werte zu indexFcn. Die Ausgabe wird gespeichert in Ergebnis, ein 15-element-cell-array, wobei jede Zelle enthält ein 100-by-100-matrix.
Die Dritte Zeile benutzt die CAT-Funktion zum verketten der 100-by-100-Matrizen in einen 100-by-100-durch-15-matrix.
Da dies offensichtlich Hausaufgaben, ich werde nicht geben Ihnen die vollständige Antwort.
Gibt es mehrere Möglichkeiten, um einen index in einer matrix. Wenn Sie verstreut index gesetzt, wie das ist, Sie brauchen, zu einem einzigen index. Also wenn
ergeben eine 2x2-submatrix von A. wir können Aber auch feststellen, dass die submatrix als
Warum habe ich diese index gesetzt? Für die Antwort, Lesen Sie über sub2ind.
In das Ende, es sieht aus wie Sie wollen, eine 15x100x100-array die extrahierten Teile. So erstellen Sie den erforderlichen index-array-up aus den teilen, die ich gezeigt habe. Sie müssen tun, eine endgültige Umgestaltung am Ende machen es die richtige Form.
Dies sollte Ihnen genug beginnen, beenden Sie Ihre Hausaufgaben.
Sie denken alle viel zu schwer, versuchen Sie dieses: mat2cell
mat2cell
arbeiten, auch in Fällen, in denen die sub-Matrizen sind nicht gleichmäßig innerhalb der großen matrix? Die ursprüngliche Frage angegeben, dass die Obere linke (x,y) Indizes der sub-Matrizen als Eingabe-Parameter, so dass die meisten wahrscheinlich die sub-Matrizen sind nicht gleichmäßig verteilt. d.h. Es ist nicht einfach ein Prozess, der gleichmäßig in der ZERLEGUNG der größeren matrix.