2016-07-09 11 views
1

Ich möchte einen Zeilenvektor (und später auch ein Spaltenvektor) zum Anhängen an eine bestehende x durch y durch z Matrix. Also im Grunde „eine neue Zeile hinzufügen (am‚Boden‘) für jedes z in der ursprünglichen 3D-Matrix Betrachten Sie das folgende kurze Matlab-ProgrammAppend Vektor zu 3D-Matrix in Matlab

appendVector = [1 2 3 4 5]; % Small matrix for brevity. Actual matrices used are much larger. 
origMatrix = ones(5,5,3); 
appendMatrix = [origMatrix(...); appendVector]; 

Meine Frage lautet:. Wie adressieren I (Matlab-style-Matrix Adressierung, nicht eine "manuelle" C-ähnliche Schleife) origMatrix (...) um den obigen Vektor anzufügen? Fühlen Sie sich frei, auch einen Vorschlag, wie die gleiche Operation für eine Spalte-Vektor (ich denke, dass der richtige Weg, um die letztere zu tun ist, einfach die ‚-Operator in Matlab zu verwenden).

+1

Wie genau beabsichtigen Sie, einen 5-Element-Vektor an eine 3D-Matrix anzuhängen. Sie benötigen ein '1 x 5 x 3' Array, weil Sie die dritte Dimension ausfüllen müssen. – Suever

+0

@Suever Ich nahm das als Teil der möglichen Lösung an. Gibt es eine Möglichkeit, diese Operation nur mit einem Vektor auszuführen (indem Matlab sich um zusätzliche Dimensionen kümmert) oder muss ich den angehängten Vektor vorbereiten, um vor dem Anhängen ein 3D-Array zu sein (wie oben beschrieben)? – Peter

Antwort

1

A "Zeile" in einer 3D-Matrix tatsächlich ein mehrdimensionales Array ist.

size(origMatrix(1,:,:)) 
% 5 3 

Um eine Zeile anzufügen, müssten Sie also ein 5 x 3 Array anhängen.

toAppend = rand(5, 3); 
appendMatrix = cat(1, origMatrix, toAppend); 

Sie konnte append nur 5-Element-Vektor und einen Index für die dritte Dimension angeben. In diesem Fall würde der Wert für die "Zeile" für alle anderen Indizes in der dritten Dimension mit Nullen gefüllt werden.

appendVector = [1 2 3 4 5]; 
origMatrix = ones(5,5,3); 

appendMatrix = origMatrix; 
appendMatrix(end+1, :, 1) = appendVector; 

Wenn Sie stattdessen den gleichen Vektor entlang der dritten Dimension anhängen möchten, können Sie repmat verwenden Ihre Vektors in eine 1 x 5 x 3 Array zu drehen und dann das anhängen.

appendVector = repmat([1 2 3 4 5], 1, 1, size(origMatrix, 3)); 
appendMatrix = cat(1, origMatrix, appendVector); 
+0

Wunderbar. Spot auf. – Peter

+0

Eine kurze Anmerkung zu Ihrem Segment über die Verwendung von Repmat. Der Code, den Sie anzeigen, gibt den Fehler: "Fehler bei der Verwendung von cat Dimensionen der verknüpften Matrizen sind nicht konsistent." Ich habe nicht untersucht, warum das ist, da der vorherige Vorschlag (nicht mit Repmat) war ausreichend, um mein Problem zu lösen. – Peter

+1

@Peter Danke, dass du das herausgebracht hast. Aktualisiert. – Suever