有一个向量x
,我必须添加一个元素(newElem
)。
之间-
x(end+1) = newElem;
和
x = [x newElem];
?
Answers:
x(end+1) = newElem
有点健壮。
x = [x newElem]
仅当x
是行向量时才有效,如果是列向量x = [x; newElem]
则应使用。x(end+1) = newElem
但是,对于行向量和列向量都适用。
通常,应避免增长媒介。如果您经常执行此操作,则可能会使您的代码难以抓取。想一想:增加一个数组需要分配新的空间,复制所有内容,添加新的元素以及清理旧的混乱...如果事先知道正确的大小,那会浪费时间:)
x
(大小为n
)”,我n
以为非零且向量已被初始化:)
end
而不是使用某个变量n
(可能是global
您所知道的全部!)是更通用,更可靠,更省钱的方法
x(end+1)=...
不用x
初始化就可以做,而且我几乎可以肯定您也可以在MATLAB中进行它
只是添加到@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)
案例的JIT优化是最近的一项改进(R2012a左右)。我很想念在杂记中一些变更注释中读到的类似内容。我在APU / Matlab R2010上也得到了截然不同的结果,但是我不确定这是由于Matlab版本还是APU ...
如前所述,使用 x(end+1) = newElem
的优点是,无论向量是否转置,它都可以将向量与标量连接起来。因此,它在添加标量时更加健壮。
但是,不应忘记的是,x = [x newElem]
当您尝试一次添加多个元素时,它也将起作用。此外,这对于要连接矩阵的情况更自然一些。M = [M M1 M2 M3]
总而言之,如果您想要一个解决方案,使您可以将现有向量x
与newElem
标量(也可以不是标量)连接起来,则可以做到这一点:
x(end+(1:numel(newElem)))=newElem
x
必须先初始化!