Matlab尾随单维

Matlab trailing singleton dimension

我有以下代码

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]

有没有可能得到正确的结果?

o的维度为4 x 3 x 1时,num2cell(o, [2 3])给出一个1 x 3向量。如documentation中所述,squeeze对二维数组没有影响,因此它将保留为行或列向量:

Two-dimensional arrays are unaffected by squeeze; if A is a row or column vector or a scalar (1-by-1) value, then B = A.

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

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

正如 所指出的,您可以将 squeeze 替换为 permute 以获得您期望的尺寸。

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