有一个向量x
,我必须添加一个元素(newElem
)。
-
之间有什么区别吗?x(end+1) = newElem;
和
x = [x newElem];
答案 0 :(得分:89)
x(end+1) = newElem
有点健壮。
x = [x newElem]
仅在x
是行向量时才有效,如果它是列向量x = [x; newElem]
则应该使用。但是,x(end+1) = newElem
适用于行向量和列向量。
总的来说,应该避免增长的载体。如果您经常这样做,它可能会使您的代码陷入困境。想想看:增加一个数组包括分配新的空间,复制一切,添加新的元素,清理旧的混乱......如果你事先知道正确的大小,相当浪费时间:)
答案 1 :(得分:26)
为了补充@ThijsW的答案,第一种方法相对于连接方法有明显的速度优势:
big = 1e5;
tic;
x = rand(big,1);
toc
x = zeros(big,1);
tic;
for ii = 1:big
x(ii) = rand;
end
toc
x = [];
tic;
for ii = 1:big
x(end+1) = rand;
end;
toc
x = [];
tic;
for ii = 1:big
x = [x rand];
end;
toc
Elapsed time is 0.004611 seconds.
Elapsed time is 0.016448 seconds.
Elapsed time is 0.034107 seconds.
Elapsed time is 12.341434 seconds.
我在2012b运行了这些时间但是当我在matlab 2010a中在同一台计算机上运行相同的代码时,我得到了
Elapsed time is 0.003044 seconds.
Elapsed time is 0.009947 seconds.
Elapsed time is 12.013875 seconds.
Elapsed time is 12.165593 seconds.
所以我猜速度优势仅适用于更新版本的Matlab
答案 2 :(得分:4)
如前所述,使用x(end+1) = newElem
的优点是它允许您将矢量与标量连接起来,无论您的矢量是否被转置。因此,它更适合添加标量。
但是,不应忘记的是,当您尝试一次添加多个元素时,x = [x newElem]
也会起作用。此外,这更加自然地概括了您想要连接矩阵的情况。 M = [M M1 M2 M3]
总而言之,如果您想要一个允许您将现有向量x
与newElem
连接起来的解决方案(可能是也可能不是标量),这应该可以解决问题:
x(end+(1:numel(newElem)))=newElem