Octave / Matlab:向vector添加新的元素

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

之间有什么区别 –

 x(end+1) = newElem; 

 x = [x newElem]; 

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

如果x是一个行向量, x = [x newElem]将仅适用,如果它是列向量x = [x; newElem] x = [x; newElem]应该被使用。 x(end+1) = newElem ,但是,行和列向量。

一般来说,应该避免增长的媒介。 如果你做了这么多,它可能会把你的代码抓取。 想想看:增长一个数组涉及到分配新的空间,复制所有内容,添加新的元素,并清理旧的混乱…如果事先知道正确的大小,那么很浪费时间:)

只要添加@ 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

如前所述,使用x(end+1) = newElem的优点在于,无论您的vector是否转置,它都允许您将vector与标量连接起来。 因此,添加标量更加稳健。

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


总而言之,如果你想要一个解决scheme,让你连接你的现有向量x newElem可能或可能不是一个标量,这应该做的伎俩:

  x(end+(1:numel(newElem)))=newElem