Имея вектор x
, и я должен добавить элемент (newElem
).
Есть ли разница между -
x(end+1) = newElem;
и
x = [x newElem];
?
Имея вектор x
, и я должен добавить элемент (newElem
).
Есть ли разница между -
x(end+1) = newElem;
и
x = [x newElem];
?
x(end+1) = newElem
является более надежным.
x = [x newElem]
будет работать, только если x
является вектором строки, если он является вектором столбца 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.
Я получил эти времена в 2012 году, но когда я запустил тот же код на том же компьютере в 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
имеет то преимущество, что позволяет конкатенировать вектор с помощью скаляра, независимо от того, транспонирован ли ваш вектор или нет. Поэтому он более надежный для добавления скаляров.
Однако не следует забывать, что x = [x newElem]
также будет работать, когда вы попытаетесь добавить сразу несколько элементов. Более того, это более естественно объясняет случай, когда вы хотите объединить матрицы. M = [M M1 M2 M3]
В общем, если вам нужно решение, которое позволит вам конкатенировать существующий вектор x
с newElem
, который может быть или не быть скаляром, это должно сделать трюк:
x(end+(1:numel(newElem)))=newElem