Dies ist nicht direkt möglich, da kein integriertes Zeichen für die Verkettung in der dritten Dimension steht (analog zum Komma und Semikolon in 2D). Eine mögliche Abhilfe hierfür wäre, mat2str
auf allen "Slices" in der dritten Dimension auszuführen und sie in einen Aufruf von cat
einzubinden, der bei der Ausführung alle 2D-Matrizen in der dritten Dimension verketten würde, um Ihre Eingabematrix neu zu erstellen.
M = reshape(1:8, [2 2 2]);
arrays = arrayfun(@(k)mat2str(M(:,:,k)), 1:size(M, 3), 'uni', 0);
result = ['cat(3', sprintf(', %s', arrays{:}), ')'];
result =
'cat(3, [1 3;2 4], [5 7;6 8])'
isequal(eval(result), M)
1
UPDATE
darüber Nachdem ich einige mehr, eine elegantere Lösung ist es, die Eingangsmatrix zu glätten, laufen mat2str
auf das, und dann in der Zeichenfolge verwendet, um die Daten neu zu erstellen, verwenden wir reshape
kombiniert mit den ursprünglichen Dimensionen, um einen Befehl bereitzustellen, der die Daten neu erstellt. Dies funktioniert für jede Dimension von Daten.
result = sprintf('reshape(%s, %s);', mat2str(M(:)), mat2str(size(M)));
Also für den folgenden 4D Eingang
M = randi([0 9], 1, 2, 3, 4);
result = sprintf('reshape(%s, %s);', mat2str(M(:)), mat2str(size(M)));
'reshape([6;9;4;6;5;2;6;1;7;2;1;7;2;1;6;2;2;8;3;1;1;3;8;5], [1 2 3 4]);'
Nun, wenn wir die Daten unter Verwendung dieser erzeugten Zeichenfolge rekonstruieren, können wir sicherstellen, dass wir die richtigen Daten zurück.
Mnew = eval(result);
size(Mnew)
1 2 3 4
isequal(Mnew, M)
1
sowohl von der Klasse und Präzision Eingaben mat2str
angeben, können wir noch besser die Eingangsdaten einschließlich Gleitkommazahlen approximieren.
M = rand(1,2,3,4,5);
result = sprintf('reshape(%s, %s);', mat2str(M(:),64,'class'), mat2str(size(M)));
isequal(eval(result), M)
1
Nun, ich habe gerade einen neuen Befehl gelernt! Jedenfalls bezweifle ich, dass es möglich ist, da es kein Trennzeichen für dritte Dimensionen gibt (wie Komma und Semikolon für 2D). Sie könnten 'sprintf' mit einem' cat (3, ') am Anfang verwenden, um alle 2D-Arrays zu einem 3D-Array zusammenzufügen. – Suever
Es war nicht trivial, den Befehl zu finden :). Ich habe es nicht verstanden, wie dein Vorschlag mit 'sprintf' funktionieren würde. – hakanc
'mat2str' ist ein Wrapper für' sprintf' und verwendet Schleifen. Es gibt keinen Grund, sie zu vermeiden. Aber wie @Suever sagt, gibt es keine Möglichkeit, ein 3D + -Array mit der gleichen Syntax einzugeben. – excaza