How can I vectorize this function with nested FOR loop?
Mostrar comentarios más antiguos
I have two for loops.L is one matrix of random numbers between 0,1 with dimension 24*100000.I want to vectorize it but i can't. because current code is very slow and take a long time.please help me.
K=zeros(100000,1);
T=zeros(100000,1);
for i=1:100000
for j=1:100000
K(j,1)=exp(-4*norm(L(:,i)-L(:,j))^2/norm(L(:,i))^2);
end
T(i,:)=sum(K)-1;
end
2 comentarios
Bob Thompson
el 2 de Jul. de 2019
(L(:,i)-L(:,j))
This is what is going to make it difficult to vectorize. I believe there is a command to calculate this for you, but I'm not sure what exactly it is. It might be easier to do some research for this specifically, rather than the vectorization.
Why do you want to vectorize the code? There is no general benefit in doing this. Does the current code run too slow? Then an acceleration is the way to go. Vectorizing can improve the speed, but this is not in general.
To optimize the code, we need the chance to run it. Without meaningful input arguments, this is hard. So please provide L.
norm(x)^2 calculates an expensive square root only to square the result afterwards.
Do oyu have the parallel processing toolbox? A parfor might be very useful.
Respuesta aceptada
Más respuestas (1)
Jan
el 4 de Jul. de 2019
n = 1000;
L = rand(24, n);
T = zeros(n, 1);
for i=1:n
K = exp(-4*sum((L(:,i) - L) .^ 2, 1) ./ sum(L(:,i).^2, 1));
T2(i) = sum(K, 2) - 1;
end
This is 100 times faster than the original version for n=1000.
With parfor instead of for a further acceleration is possible.
To my surprise the above code is faster than this, which omits the repeated squaring:
T = zeros(n,1);
L2 = L .^ 2;
for i=1:n
K = exp(-4*sum((L2(:,i) - 2*L(:,i).*L + L2), 1) ./ sum(L2(:,i), 1));
T(i) = sum(K, 2)-1;
end
2 comentarios
abtin irani
el 4 de Jul. de 2019
Jan
el 4 de Jul. de 2019
You use Matlab < R2016b. Then:
K = exp(-4*sum((L2(:,i) - bsxfun(@times, 2*L(:,i), L) + L2), 1) ...
./ sum(L2(:,i), 1));
But the first version seems to be faster.
Categorías
Más información sobre Parallel Computing 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!