Матричное конечное синглтонное измерение
У меня есть следующий код
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)