MATLAB: Speeding up code

speed up code speeding ndgrid for loop

I am doing a Physics PhD, and working on a code to model the scattering of light off particles. One section of my code in particular takes ages, and I was wandering if anyone would be able to give me some help with how to speed it up. I managed it cut a chunk of time out by replacing two for loops by matrices, using the ndgrid. I thought that I could possibly turn the last two for loops into matrices, possibly by making a 4D matrix, but I can't get my head round if/how this would be done. Anyway here's the section of code:
Probscatt=zeros(Ntheta,Nphi);
[Y,Z]=ndgrid(y,z);
for m=1:Ntheta
for n=1:Nphi
Probscatt(m,n)=(dy*dz)*(sum(sum((abs(cyz)).^2.*(cos(2*pi*(Y*sin(phi(n))*sin(theta(m))+Z*sin(phi(n))*cos(theta(m))))).^2)));
end
end
y and z are vectors, dy and dz are just numbers, and cyz is a matrix with the same dimensions as Y and Z.
If it would help to explain the context: Probscatt is the probability of light scattering at angle theta, phi. The light is scattering off two particles, which are in a 2D space, with coordinates y and z (this is where the Y and Z come from.
Thanks!

Best Answer

Some general rules for efficient code:
  • Avoid repeated calculations, but use temporary variables instead. Here e.g. "cos(theta(m))" is calculated in each iteration, as "2*pi*Y", "sin(theta(m))", etc.
  • Process arrays column-wise. In your code it will be faster to swap the "for m" and "for n" loops, because then in "Probscatt(m,n)" elements neighboring in the memory are written.