tag - title matlab
Octave/Matlab: Agregar nuevos elementos a un vector (3)
Tener un vector x
tengo que agregar un elemento ( newElem
).
¿Hay alguna diferencia entre -
x(end+1) = newElem;
y
x = [x newElem];
?
Como se mencionó anteriormente, el uso de x(end+1) = newElem
tiene la ventaja de que le permite concatenar su vector con un escalar, independientemente de si su vector está transpuesto o no. Por lo tanto, es más robusto para agregar escalares.
Sin embargo, lo que no debe olvidarse es que x = [x newElem]
también funcionará cuando intente agregar múltiples elementos a la vez. Además, esto se generaliza de forma más natural en el caso en que desee concatenar matrices. M = [M M1 M2 M3]
Con todo, si quieres una solución que te permita concatenar tu vector existente x
con newElem
que puede ser escalar o no, esto debería ser el truco:
x(end+(1:numel(newElem)))=newElem
Solo para agregar a la respuesta de @ ThijsW, hay una ventaja de velocidad significativa para el primer método sobre el método de concatenación:
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.
Me puse a correr estos tiempos en 2012b, sin embargo, cuando ejecuté el mismo código en la misma computadora en Matlab 2010, me sale
Elapsed time is 0.003044 seconds.
Elapsed time is 0.009947 seconds.
Elapsed time is 12.013875 seconds.
Elapsed time is 12.165593 seconds.
Así que supongo que la ventaja de velocidad solo se aplica a las versiones más recientes de Matlab
x(end+1) = newElem
es un poco más robusto.
x = [x newElem]
solo funcionará si x
es un vector de fila, si es un vector de columna x = [x; newElem]
x = [x; newElem]
debe ser utilizado. x(end+1) = newElem
, sin embargo, funciona para vectores de fila y columna.
En general, sin embargo, se deben evitar los vectores crecientes. Si haces esto mucho, puede llevar tu código a un nivel bajo. Piénselo: hacer crecer una matriz implica asignar espacio nuevo, copiar todo, agregar el nuevo elemento y limpiar el viejo desastre ... Bastante pérdida de tiempo si conoce el tamaño correcto de antemano :)