2016-03-23 4 views
2

für Matrizen, den Wert eines mehrdimensionalen Array Drucken mit Abmessungen gleich oder weniger als 2 lautet der Befehl:mit der Ausgangs kompatibles Matlab Code

Zum Beispiel:

>> mat2str(ones(2,2)) 

ans = 

[1 1;1 1] 

jedoch as the help states, dies tut nicht für höhere Dimensionen arbeiten:

>> mat2str(rand(2,2,2)) 
Error using mat2str (line 49) 
Input matrix must be 2-D. 

Wie mit höheren Dimensionen Ausgang Matrizen als 2 mit dem Code kompatibel ist, ohne Maß zu greifen fo r Schleifen?

+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

+0

Es war nicht trivial, den Befehl zu finden :). Ich habe es nicht verstanden, wie dein Vorschlag mit 'sprintf' funktionieren würde. – hakanc

+0

'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

Antwort

4

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 
+0

Ich wählte die Antwort, weil es eine Lösung für 3D-Matrizen ist, obwohl ich nicht klar sehen kann, wie es zu höheren Dimensionen erweitert werden kann. Aus Python kommend kann ich nicht wirklich verstehen, wie man in Matlab keine Arrays mit höheren Dimensionen konsistent definieren kann. – hakanc

+1

@hakanc Ich habe meine Lösung mit einer kürzeren Lösung aktualisiert, die für jede Dimension von Daten geeignet ist. – Suever

+0

@hakanc * man kann Arrays mit höheren Dimensionen nicht definieren *, ja du kannst! aber in einer Schnur? warum in einer Schnur? gedruckt? Warum würden Sie eine 5-dimensionale Matrix drucken? Erstellen sie ist einfach, 'Rand (2,2,2,2,2,2,2,2,2,2,2,2,2)' funktioniert ..... –