Matlab连接可能有bug

时间:2014-01-11 02:37:39

标签: arrays matlab matrix multidimensional-array matrix-indexing

我想以左侧为空时支持连接的方式连接两个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

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

1 个答案:

答案 0 :(得分: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,返回的大小   提供的变量X中的数组d1,d2,d3,...,dn的维度   输出参数n的数量等于ndims(X)。如果n不相等   ndims(X),以下例外情况:

     
      
  • n > ndims(X):size返回“额外”变量中的变量,即与ndims(X)+1n对应的变量。
  •   

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,然后增加一end+1,从而产生a(:,:,2)=ones(2)因此开头的额外空间充满了零。

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

>> a = zeros(0,0,0);
>> a(:,:,end+1) = ones(2);
相关问题