Efficiency help
Mostrar comentarios más antiguos
hi, i need some help in improving this section of code. it takes over 20 seconds to run. Because i have over 150 samples to run, a 10 second improvement would mean close to 1 hour of time saved. Thanks!
for p = 1: length(unique_cell(1,:)) for f = 1:length(ions{1,p})
max_inloop(f)= (ions{2,p}(1,f))/(ions{1,p}(1,f));
max_inloop2(f)= (ions{1,p}(1,f))/(ions{2,p}(1,f));
end
max_ion_list{p} = max_inloop;
max_ion_list2{p} = max_inloop2;
end
1 comentario
Alex
el 13 de En. de 2012
One issue you are having with speed is based off of memory, each time through the loop, MATLAb is having to re-allocate memory for a larger cell matrix. Simply defining the size of the cell before you start the loop will save a LOT of time.
Respuesta aceptada
Más respuestas (1)
Alex
el 13 de En. de 2012
This should work. I can't test it out though. Also, note the comment I made on your main post. Always pre-allocate memory if you can. Currently, within your loop, each time, Matlab has to take time to make the matrix larger.
max_ion_list = cell(length(unique_cell(1,:)), length(ions{1,p}));
max_ion_list2 = cell(length(unique_cell(1,:)), length(ions{1,p}));
f = 1:length(ions{1,p});
for p = 1: length(uniue_cell(1,:))
max_ion_list{p} = (ions{2,p}(1,f))/(ions{1,p}(1,f));
max_ion_list2{p} = (ions{1,p}(1,f))/(ions{2,p}(1,f));
end
5 comentarios
Andy
el 13 de En. de 2012
Walter Roberson
el 13 de En. de 2012
Alex, with "f" being a vector, you have vector / vector, and that is going to be the mrdivide operation rather than the rdivide operation which is coded as ./
Alex
el 20 de En. de 2012
I was referencing max_ion_list{p} = [];
I thought, that without pre-allocation, on each loop iteration, the size of max_ion_list would grow by one, and thus the Matlab memory manager would need to allocate memory for a larger variable, copy the variable, and then clear the old memory space.
Am I wrong? Is the Matlab memory manager capable to detecting how large the variable will be at runtime?
Walter Roberson
el 20 de En. de 2012
In R2011b, MATLAB apparently does better on memory allocation; I do not have access to that version to experiment with.
max_ion_list{p} = []; will not help with pre-allocation, as all of max_ion_list{p} is overwritten.
Anyhow, my earlier comment to you had nothing to do with preallocation, and only had to do with the difference between the "/" operator that you coded and the "./" operator that is needed.
Alex
el 23 de En. de 2012
Ahh, I understand now.
Categorías
Más información sobre Loops and Conditional Statements en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!