76

有一个向量x,我必须添加一个元素 ( newElem) 。

有什么区别-

x(end+1) = newElem; 

x = [x newElem];

?

4

3 回答 3

93

x(end+1) = newElem更健壮一点。

x = [x newElem]仅当x是行向量时才有效,如果它是列向量x = [x; newElem],则应使用。x(end+1) = newElem但是,适用于行向量和列向量。

但总的来说,应该避免增长的向量。如果你经常这样做,它可能会使你的代码陷入困境。想一想:增加一个数组涉及分配新空间、复制所有内容、添加新元素以及清理旧的混乱......如果你事先知道正确的大小,那就太浪费时间了 :)

于 2013-04-24T09:15:54.680 回答
28

只是为了补充@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

于 2013-04-24T09:20:32.823 回答
4

如前所述,使用x(end+1) = newElem的优点是它允许您将向量与标量连接起来,而不管您的向量是否被转置。因此,添加标量更加稳健。

但是,不应该忘记的是,x = [x newElem]当您尝试一次添加多个元素时,它也会起作用。此外,这更自然地概括为您想要连接矩阵的情况。M = [M M1 M2 M3]


总而言之,如果您想要一个允许您将现有向量xnewElem可能或可能不是标量连接的解决方案,这应该可以解决问题:

 x(end+(1:numel(newElem)))=newElem
于 2013-04-24T19:27:58.363 回答