Octave / Matlab: добавление новых элементов в вектор

matlab vector octave element

147010 просмотра

3 ответа

Имея вектор, xи я должен добавить элемент ( newElem).

Есть ли разница между -

x(end+1) = newElem; 

а также

x = [x newElem];

?

Автор: URL87 Источник Размещён: 12.11.2019 09:11

Ответы (3)


91 плюса

Решение

x(end+1) = newElem немного надежнее

x = [x newElem]будет работать, только если xэто вектор-строка, если это вектор-столбец x = [x; newElem]. x(end+1) = newElemоднако работает как для строк, так и для столбцов.

В целом, следует избегать растущих векторов. Если вы делаете это много, это может привести к ползанию вашего кода. Подумайте об этом: увеличение массива включает в себя выделение нового пространства, копирование всего, добавление нового элемента и очистку старого беспорядка ... Потеря времени, если вы заранее знали правильный размер :)

Автор: ThijsW Размещён: 24.04.2013 09:15

27 плюса

Просто добавьте к ответу @ 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

Автор: Dan Размещён: 24.04.2013 09:20

4 плюса

Как упоминалось ранее, использование x(end+1) = newElemимеет то преимущество, что оно позволяет вам объединять ваш вектор со скаляром, независимо от того, транспонирован ваш вектор или нет. Поэтому он более надежен для добавления скаляров.

Однако не следует забывать, что x = [x newElem]это также сработает при попытке добавить несколько элементов одновременно. Кроме того, это обобщает немного более естественно на случай, когда вы хотите объединить матрицы.M = [M M1 M2 M3]


В общем, если вам нужно решение, позволяющее объединить существующий вектор xс этим, newElemкоторый может быть, а может и не быть скалярным, это должно сработать:

 x(end+(1:numel(newElem)))=newElem
Автор: Dennis Jaheruddin Размещён: 24.04.2013 07:27
Вопросы из категории :
32x32