2016-09-19 3 views
1

Ich habe den folgenden CodeMatlab Singletons Dimension Hinter

o = ones(4,3,2) 
c = cellfun(@squeeze,num2cell(o,[2 3]), 'UniformOutput', false) 

, die die 4-Zellen wie erwartet gibt, die jeweils 3x2 Matrizen.

Aber wenn ich die letzte Dimension von o zu einem reduzieren, ist das Verhalten absolut nicht wie erwartet:

o = ones(4,3,1) 
c = cellfun(@squeeze,num2cell(o,[2 3]), 'UniformOutput', false) 

Die Ausgabe lautet:

[1x3 double] 
[1x3 double] 
[1x3 double] 
[1x3 double] 

Während ich erwarten würde:

[3x1 double] 
[3x1 double] 
[3x1 double] 
[3x1 double] 

Jede Möglichkeit, wie Sie das richtige Ergebnis erhalten?

Antwort

3

Wenn die Dimension der o ist 4 x 3 x 1, gibt num2cell(o, [2 3]) einen 1 x 3 Vektor. Wie in den documentation erwähnt, hat keinen Einfluss auf squeeze eine 2D-Array, so wird es ein Zeilen- oder Spaltenvektor bleiben:

Zweidimensionale Arrays von Squeeze nicht beeinflusst werden; Wenn A ein Zeilen- oder Spaltenvektor oder ein Skalarwert (1-mal-1) ist, dann B = A.

size(squeeze(rand(1, 3))) 
% 1 3 

size(squeeze(rand(3, 1))) 
% 3 1 

Wie bereits von @Luis aus, könnten Sie squeeze mit permute ersetzen, um die Dimensionen erhalten Sie erwarten würden.

c = cellfun(@(x)permute(x, [2 3 1]), num2cell(o,[2 3]), 'UniformOutput', false) 
+3

... so wäre die Lösung von '@ (x) permute (x, [2 3 1])' –

+0

@LuisMendo Vielen Dank für das ersetzen '@ squeeze' sein! – Suever