Одноэлементное измерение Matlab

У меня есть следующий код

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

что дает, как и ожидалось, 4 ячейки, каждая из которых содержит матрицы 3x2.

Но если я уменьшу последнее измерение o до единицы, поведение будет совершенно не таким, как ожидалось:

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

Результат:

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

В то время как я ожидал бы:

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

Любая возможность, как получить правильный результат?


person W. Alpha    schedule 19.09.2016    source источник


Ответы (1)


Когда размерность o равна 4 x 3 x 1, num2cell(o, [2 3]) дает вектор 1 x 3. Как указано в документации, squeeze не влияет на двумерный массив. , поэтому он останется вектором строки или столбца:

Двумерные массивы не подвержены сжатию; если A является вектором строки или столбца или скалярным (1 на 1) значением, то B = A.

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

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

Как указал @Luis, вы можете заменить squeeze на permute, чтобы получить ожидаемые размеры.

c = cellfun(@(x)permute(x, [2 3 1]), num2cell(o,[2 3]), 'UniformOutput', false)
person Suever    schedule 19.09.2016
comment
... поэтому решением было бы заменить @squeeze на @(x)permute(x,[2 3 1]) - person Luis Mendo; 19.09.2016
comment
@LuisMendo Спасибо за это! - person Suever; 19.09.2016