Octave/Matlab:向向量添加新元素

Posted

技术标签:

【中文标题】Octave/Matlab:向向量添加新元素【英文标题】:Octave/Matlab: Adding new elements to a vector 【发布时间】:2013-04-17 18:31:44 【问题描述】:

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

有没有区别-

x(end+1) = newElem; 

x = [x newElem];

?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

同样对于第二种方法,必须先初始化x @RodyOldenhuis,没问题!我也做了同样的事情,可能是同时做的。 @Dan,这是真的,但是正如提到的问题“有一个向量 x(大小为 n)”,我有点假设 n 不为零并且向量已经被初始化:) @ThijsW: 尽管如此,使用end 而不是一些变量n(可能是global,就你所知!)是更通用、更强大且无成本的方法去 @Dan x 必须为这两种方法初始化。 @Robino 我不这么认为,我没有要检查的 MATLAB,但是在八度音程中,您当然可以在不初始化 x 的情况下执行 x(end+1)=...,我几乎可以肯定您可以这样做它在 MATLAB 中也是如此【参考方案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

【讨论】:

+1,已编辑以添加显而易见的内容。我将在“真正的”CPU 上再次测试(我现在正在使用这个糟糕的、不可靠的、不好的 APU 东西......) @Dan,我也一样,第三个选项我得到 0.028,最后一个选项得到 8.909 我还认为 x(end+1) 案例的 JIT 优化是最近添加的(R2012a 左右......)。我隐约记得在 smoe 点的一些变更说明中读过类似的内容。我的 APU/Matlab R2010 也得到了非常不同的结果,但我不确定这是由于 Matlab 版本还是 APU... @RodyOldenhuis 和 ThiijsW 看看我最近对新旧 matlab 的比较 @Dan: 啊 :) 好的,现在好多了 :)【参考方案3】:

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

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


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

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

【讨论】:

我认为你的最后一个例子应该是:x(end+1:end+length(newElem)) = newElem @Digna 感谢您发现错误,我已经更新了解决问题的答案。 在我的 Matlab2011b 中,与 a=[a b] 方法相比,这种方法的向量连接速度也有显着提升(约 50 倍)。 @Jabe [a b] 方法是连接。我想你是说扩展数组比串联更快?

以上是关于Octave/Matlab:向向量添加新元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中向向量中添加新对象

从C ++ 11线程安全地向向量添加元素

将 octave/matlab 输出写入剪贴板

Octave / MATLAB 中的 deal() 函数有啥意义?

斐波纳契函数在matlab / octave中

Coursera machine learning 第二周 quiz 答案 Octave/Matlab Tutorial