Wenn Sie möchten, um zu vermeiden, eine for-Schleife zu verwenden, ist dies wahrscheinlich der sauberste Weg, es zu tun:
indexCell = num2cell(indexmatrix,1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix),indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
ERKLÄRUNG:
Die erste Zeile jeder Spalte von indexmatrix legt in separate Zellen eines Zellenarrays mit NUM2CELL. Dies ermöglicht es uns, alle k Spalten als comma-separated list in SUB2IND passieren, eine Funktion, die subscripted Indizes (Zeile, Spalte, etc.) in linearen Indizes (jedes Matrixelement konvertiert wird nummeriert von 1 bis N, wobei N die Gesamtzahl der Elemente in der Matrix). Die letzte Zeile verwendet diese linearen Indizes, um Ihre for-Schleife zu ersetzen. Eine gute Diskussion über Matrixindizierung (tiefgestellt, linear und logisch) findet sich here.
etwas mehr DENKANSTOSS ...
Die Tendenz von for-Schleifen für vektorisiert Lösungen zu scheuen ist etwas, was viele MATLAB-Anwender (mich eingeschlossen) haben sich daran gewöhnt zu. Neuere Versionen von MATLAB verarbeiten Schleifen jedoch wesentlich effizienter. Wie in this answer zu einer anderen SO-Frage diskutiert, kann die Verwendung von for-Schleifen manchmal zu schnellerem Code führen als bei einer vektorisierten Lösung.
Ich sage NICHT, dass Sie nicht versuchen sollten, Ihren Code mehr zu vektorisieren, nur dass jedes Problem einzigartig ist. Vectorizing wird oft effizienter sein, aber nicht immer. Für Ihr Problem wird die Ausführungsgeschwindigkeit von for-Schleifen im Vergleich zu vektorisiertem Code wahrscheinlich davon abhängen, wie groß die Werte n und k sind.
Großartig! Kannst du es auch unabhängig von der Anzahl der Zeilen bekommen? – AnnaR
@AnnaR - Ich habe gerade eine Antwort geschrieben, die alle 'n' Zeilen von' indexmatrix' gleichzeitig behandelt. – Shai