我想以左侧为空时支持连接的方式连接两个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
这是一个错误吗?实现这个目标的正确方法是什么?
答案 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)+1
到n
对应的变量。
end
使用大小来计算返回的索引。要查看此操作,我们可以使用自定义版本重载end
函数:
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);