preallocate vector or not

13 visualizaciones (últimos 30 días)
Salvatore Mazzarino
Salvatore Mazzarino el 22 de Sept. de 2012
I'm doing a simulation and I initialize a vector that will contain during the simulation integer values. At the beginning I don't know its length so I can't initialize it to any value but I initialize it in this way:
vector = [];
as empty vector Starting my simulation integer values will be added depending on the results of this simulation. Matlab return me a suggestion to preallocate it for speed. This way it's correct or there is another way to do ?

Respuestas (3)

Thomas
Thomas el 22 de Sept. de 2012
Editada: Thomas el 22 de Sept. de 2012
Preallocation helps speed up code and reduces memory fragmentation..
The following link will help you understand how..
Another good link on improving speed..

José-Luis
José-Luis el 22 de Sept. de 2012
Editada: José-Luis el 22 de Sept. de 2012
You should preallocate for speed, just try:
numVals = 10^5;
noAlloc = [];
Alloc = NaN * ones(numVals,1);
tic
for ii = 1:numVals
noAlloc = [noAlloc 1];
end
toc
tic
for ii = 1:numVals
Alloc(ii) = 1;
end
toc
I get:
Elapsed time is 10.128797 seconds. (No allocation)
Elapsed time is 0.000335 seconds. (Pre-allocation)
A difference of four orders of magnitude. I would recommend to allocate a vector as large as you think you might need, and then save your values in it, something like:
your_res = NaN * ones(reasonable_val,1);
counter = 1;
for ii = 1:your_simulations
if you_get_result
your_res(counter) = your_val;
counter = counter + 1;
if counter > reasonable_val %You could skip this, but it will return an error if counter > reasonable_val
your_res = [your_res; NaN*ones(reasonable_val,1)];
end
end
end
your_res(counter:end) = [];
Alternatively, a cell array does not require contiguous memory allocation (well, all elements inside a cell are in contiguous memory locations), so it might be a (slower) alternative to your problem, as it does not require reallocating your array if it overruns an empty memory block.
  2 comentarios
Azzi Abdelmalek
Azzi Abdelmalek el 22 de Sept. de 2012
Editada: Azzi Abdelmalek el 22 de Sept. de 2012
not fair comparison, why
noAlloc = [noAlloc 1]
and not
Alloc(ii) = 1
Elapsed time is 0.058491 seconds.
Elapsed time is 0.010952 seconds.
José-Luis
José-Luis el 22 de Sept. de 2012
Because that's how I understood how Salvatore intended to build his results matrix.

Iniciar sesión para comentar.


Azzi Abdelmalek
Azzi Abdelmalek el 22 de Sept. de 2012
I think, if you have an idea about your vector size, your code will be faster, if you preallocate:
A=zeros(1,m) % for example

Categorías

Más información sobre Resizing and Reshaping Matrices en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by