Имея вектор 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
, однако, работает как с векторами-строками, так и с векторами-столбцами.
Однако в целом следует избегать растущих векторов. Если вы будете делать это часто, ваш код может перестать работать. Подумайте об этом: рост массива включает в себя выделение нового места, копирование всего, добавление нового элемента и очистку старого беспорядка ... Довольно пустая трата времени, если вы заранее знали правильный размер :)
x
!
- person Dan; 24.04.2013
x
(размера n
), я вроде предположил, что n
ненулевой, а вектор уже инициализирован :)
- person ThijsW; 24.04.2013
end
, а не какой-то переменной n
(которая может быть global
, насколько вы знаете!) Является более универсальным, надежным и бесплатным способом.
- person Rody Oldenhuis; 24.04.2013
x(end+1)=...
без инициализации x
, и я почти уверен, что вы также можете сделать это в MATLAB
- person Dan; 17.09.2017
x(end+1)=123
дает Неопределенную функцию или переменную 'x'.
- person Robino; 18.09.2017
Чтобы добавить к ответу @ 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)
- довольно недавнее дополнение (R2012a или около того ...). Я смутно помню, как читал что-то подобное в некоторых чейндженотах в Smoe Point. Я также получаю очень разные результаты на моем APU / Matlab R2010, но я не уверен, связано ли это с версией Matlab или APU ...
- person Rody Oldenhuis; 24.04.2013
Как упоминалось ранее, использование x(end+1) = newElem
имеет то преимущество, что оно позволяет объединить ваш вектор со скаляром, независимо от того, транспонирован ваш вектор или нет. Поэтому он более надежен для добавления скаляров.
Однако не следует забывать, что x = [x newElem]
также будет работать, когда вы попытаетесь добавить несколько элементов одновременно. Более того, это более естественно обобщается на случай, когда вы хотите объединить матрицы. M = [M M1 M2 M3]
В общем, если вам нужно решение, которое позволяет объединить ваш существующий вектор x
с newElem
, который может быть или не быть скаляром, это должно помочь:
x(end+(1:numel(newElem)))=newElem