Матричное конечное синглтонное измерение

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

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

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

Но если я уменьшу последнее измерение 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]

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

1 ответ

Решение

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

Двумерные массивы не зависят от сжатия; если 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)
Другие вопросы по тегам