1

当左侧为空时,我想以支持连接的方式连接两个 3d 数组。我希望以下代码能够工作,但 Matlab(2012b 和 2013a)似乎在开头插入了一个额外的零矩阵。

a=[]
a =
 []
K>> a(:,:,(end+1):(end+2))=ones(2,2,2)
a(:,:,1) =
     0     0
     0     0
a(:,:,2) =
     1     1
     1     1
a(:,:,3) =
     1     1
     1     1

这是一个错误吗?实现这一目标的正确方法是什么?

4

1 回答 1

1

问题在于您初始化的方式a。考虑以下:

>> a = [];    % equivalent to zeros(0,0)
>> [m,n,p] = size(a)
m =
     0
n =
     0
p =
     1

这在size函数的文档中有解释:

[d1,d2,d3,...,dn] = size(X), 对于, 返回变量n > 1中数组维度的大小,前提是输出参数的数量等于。如果不等于 ,则以下异常成立:Xd1,d2,d3,...,dnnndims(X)nndims(X)

  • n > ndims(X): size 返回“额外”变量中的值,即那些对应于ndims(X)+1through的值n

大小用于end计算返回的索引。为了看到这一点,我们可以end用我们的自定义版本重载该函数:

@double\end.m

function ind = end(a, k, n)
    ind = builtin('end',a,k,n);
    keyboard
end

将上述函数保存在路径上的某个位置,调用:

>> a = [];
>> a(:,:,end+1) = ones(2);

您将看到ind返回的计算索引end为 1,然后将其递增 1,从而end+1导致a(:,:,2)=ones(2)开头的额外空间被零填充。

要解决此问题,请正确初始化矩阵:

>> a = zeros(0,0,0);
>> a(:,:,end+1) = ones(2);
于 2014-01-11T02:57:15.320 回答