Octave / Matlab: добавление новых элементов в вектор
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:1527 плюса
Просто добавьте к ответу @ 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:204 плюса
Как упоминалось ранее, использование 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
Вопросы из категории :
- matlab Каковы эффективные способы объединения двух структур в MATLAB?
- matlab Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- matlab Каков самый простой способ экспортировать данные Excel в Matlab?
- matlab Как работают свойства в объектно-ориентированном MATLAB?
- matlab Как нарисовать график поверхности без черных краев в MATLAB?
- vector Как получить доступ к последнему значению в векторе?
- vector Объединение двух стандартных: векторов
- vector Как отсортировать std :: vector по значениям другого std :: vector?
- vector Стирание элементов из вектора
- vector Векторная графика в iText PDF
- octave «Клонирование» векторов строк или столбцов
- octave два массива, определяющие 2d координаты, как индексы массива, в matlab / octave
- octave Октава / Матлаб: Расширить вектор, чтобы он повторялся?
- octave Как я могу вычислить все факторы числа в октаве (не только простые факторы)?
- octave Как нарисовать круг в GNU Octave
- element Выберите N случайных элементов из списка <T> в C #
- element Проверка, является ли массив многомерным или нет?
- element Как я могу сослаться на тег script, который загрузил выполняемый в данный момент скрипт?
- element Удаление элемента из массива (Java)
- element Поместите значок внутри элемента ввода в форме