MATLAB 2013a:sum + squeeze维度不一致

Joh*_*ith 5 arrays matlab transpose matrix multidimensional-array

请让我试着通过一个例子来解释

numel_last_a = 1;
numel_last_b = 2

a = rand(2,20,numel_last_a);
b = rand(2,20,numel_last_b);
size(squeeze(sum(a,1)))
size(squeeze(sum(b,1)))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出将是

ans = 1 20
ans = 20 2
Run Code Online (Sandbox Code Playgroud)

这意味着我必须捕获numel_last_x == 1的特殊情况,以应用转置操作以便与后续步骤保持一致.我猜想必须有一个更优雅的解决方案.你能帮助我吗?

编辑:对不起,代码错了!

Lui*_*ndo 5

以下观察结果如下:

  1. 你提到的不一致性深埋在Matlab语言中:所有数组都被认为至少是2D.例如,ndims(pi)给出2.
  2. Matlab中的另一个规则是假设所有数组都具有无限多个尾随单例维度.例如,size(pi,5)给出1.

根据观察1,squeeze如果这样做会少于两个维度,则不会删除单个维度.这在文档中提到:

B = squeeze(A)返回一个B具有相同元素的数组A,但删除了所有单例尺寸.单身维度是其中的任何维度size(A,dim) = 1.二维阵列不受影响squeeze; 如果A是行或列向量或标量(1乘1)值,则B = A.

如果你想摆脱第一个单身,你可以利用观察2并使用reshape:

numel_last_a = 1;
numel_last_b = 2;
a = rand(2,20,numel_last_a);
b = rand(2,20,numel_last_b);
as = reshape(sum(a,1), size(a,2), size(a,3));
bs = reshape(sum(b,1), size(b,2), size(b,3));
size(as)
size(bs)
Run Code Online (Sandbox Code Playgroud)

ans =
    20     1
ans =
    20     2
Run Code Online (Sandbox Code Playgroud)