Otro enfoque que tiene en cuenta el rendimiento al mismo tiempo tratando de ser eficiente con el espacio, es realizar una asignación previa de memoria en grandes lotes, añadiendo más lotes según sea necesario. Esto es muy adecuado si tiene que agregar una gran cantidad de elementos sin saber cuántos de antemano.
BLOCK_SIZE = 2000; % initial capacity (& increment size)
listSize = BLOCK_SIZE; % current list capacity
list = zeros(listSize, 2); % actual list
listPtr = 1; % pointer to last free position
while rand<1-1e-5 % (around 1e5 iterations on avrg)
% push items on list
list(listPtr,:) = [rand rand]; % store new item
listPtr = listPtr + 1; % increment position pointer
% add new block of memory if needed
if(listPtr+(BLOCK_SIZE/10) > listSize) % less than 10%*BLOCK_SIZE free slots
listSize = listSize + BLOCK_SIZE; % add new BLOCK_SIZE slots
list(listPtr+1:listSize,:) = 0;
end
end
list(listPtr:end,:) = []; % remove unused slots
EDITAR: A modo de comparación tiempo, considere los siguientes casos:
- El mismo código que el anterior hecho por 50000 iteraciones.
- preasignación toda la matriz de antemano:
list = zeros(50000,2); list(k,:) = [x y];
- vectores dinámicamente la adición a la matriz:
list = []; list(k,:) = [x y];
En mi máquina, los resultados fueron:
1) Tiempo transcurrido es 0,080214 segundo.
2) El tiempo transcurrido es 0.065513 segundos.
3) El tiempo transcurrido es 24.433315 segundos.
Actualizar:
Tras los debates en los comentarios, he vuelva a realizar algunas pruebas utilizando la versión más reciente R2014b. La conclusión es que las versiones recientes de MATLAB han mejorado enormemente el rendimiento del crecimiento automático de matrices.
Sin embargo, hay una trampa; la matriz debe crecer a lo largo de la última dimensión (columnas en el caso de las matrices 2D). Es por eso que agregar filas como originalmente se pretendía es aún demasiado lento sin preasignación. Aquí es donde la solución propuesta anteriormente puede ayudar realmente (ampliando la matriz en lotes).
ver aquí para el conjunto completo de pruebas: https://gist.github.com/amroamroamro/0f104986796f2e0aa618
Además, si se trata de una tarea de clase y tiene que mostrar las iteraciones; puedes usar sprintf dentro de tu implementación de Euler. – ccook
Otra pregunta relacionada: [Agregar un vector a una matriz MATLAB vacía] (http://stackoverflow.com/q/781410/97160) – Amro