八度/ Matlab的:添加新的元素,一个向量(Octave/Matlab: Adding new

2019-09-01 00:51发布

具有矢量x和我必须添加的元素( newElem )。

是否有任何区别 -

x(end+1) = newElem; 

x = [x newElem];

Answer 1:

x(end+1) = newElem是有点更坚固。

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

虽然在一般应避免日益增长的载体。 如果你这样做了很多,它可能会带来你的代码下降到爬行。 想想看:越来越多的数组涉及,如果你知道正确的尺寸事先分配新的空间,在将所有内容复制,加入新元素,并清理旧乱...的相当浪费时间:)



Answer 2:

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



Answer 3:

正如前面提到的,使用x(end+1) = newElem的优点是,它可以让你用一个标量串接您的载体,不管你的向量是否被调换或没有。 因此,它是用于添加标量更稳健。

然而,什么不应该忘记的是, x = [x newElem]也将当您尝试一次添加多个元素的工作。 此外,这种更自然地概括了一下,在这里你想连接矩阵的情况。 M = [M M1 M2 M3]


总而言之,如果你想要一个解决方案,让你来连接现有的矢量xnewElem可能会或可能不会是一个标量,这应该做的伎俩:

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


文章来源: Octave/Matlab: Adding new elements to a vector