八度/ Matlab:向向量添加新元素


75

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

之间-

x(end+1) = newElem; 

x = [x newElem];

Answers:


93

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

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

通常,应避免增长媒介。如果您经常执行此操作,则可能会使您的代码难以抓取。想一想:增加一个数组需要分配新的空间,复制所有内容,添加新的元素以及清理旧的混乱...如果事先知道正确的大小,那会浪费时间:)


3
同样对于第二种方法,x必须先初始化!
2013年

1
@RodyOldenhuis,没问题!我做了同样的事情,大概是在同一时间。@Dan,是的,但是正如提到的问题“具有一个向量x(大小为n)”,我n以为非零且向量已被初始化:)
ThijsW 2013年

1
@ThijsW:不过,使用end而不是使用某个变量n(可能是global您所知道的全部!)是更通用,更可靠,更省钱的方法
Rody Oldenhuis

两种方法都必须初始化@Dan x。
罗比诺

@Robino我不这样认为,我没有MATLAB要检查,但是在倍频程中,您当然可以x(end+1)=...不用x初始化就可以做,而且我几乎可以肯定您也可以在MATLAB中进行它
Dan

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


+1,也添加了显而易见的内容。我将再次在“真正的” CPU上进行测试(我现在正在处理这种糟糕的,不可靠的APU不好的事情……)
Rody Oldenhuis

@Dan,对我来说一样,第3个选项我得到0.028,最后一个选项我得到8.909
ThijsW 2013年

1
我还认为针对该x(end+1)案例的JIT优化是最近的一项改进(R2012a左右)。我很想念在杂记中一些变更注释中读到的类似内容。我在APU / Matlab R2010上也得到了截然不同的结果,但是我不确定这是由于Matlab版本还是APU ...
Rody Oldenhuis 2013年

@RodyOldenhuis和ThiijsW看到了我最近在较新的Matlab之间进行的比较
Dan

@Dan:啊:)好的,现在
一切都好了

4

如前所述,使用 x(end+1) = newElem的优点是,无论向量是否转置,它都可以将向量与标量连接起来。因此,它在添加标量时更加健壮。

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


总而言之,如果您想要一个解决方案,使您可以将现有向量xnewElem标量(也可以不是标量)连接起来,则可以做到这一点:

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

1
我认为您的最后一个示例应该是:x(end + 1:end + length(newElem))= newElem
Digna

@Digna感谢您发现错误,我已经更新了解决此问题的答案。
丹尼斯·贾赫鲁丁

1
与我的Matlab2011b相比,此方法与a = [ab]方法相比,向量级联的速度也有了显着提高(〜50倍)。
JaBe 2015年

@Jabe [ab]方法是串联的。我想你是说扩展数组比连接快吗?
罗比诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.