execution of code very long

5 次查看(过去 30 天)
Fatiha
Fatiha 2012-5-23
Hi, I need help to improve the following code. The execution is too long 79.014s
function [Dmin]=dist_am(Q,R,Obs,N,d,n_obs,contact,comp)
% Dp is matrix of distances
% attention D(c) corresponds to c ieme contact possible
% Dmin= min(D)
Dmin=0;
if comp>0 % table of contact is not empty
Dp=zeros(comp,1);
% on parcourt le tableau de contact
for c=1:comp
if(contact(c,3)==0) % contact particule-particule
i=contact(c,1);
j=contact(c,2);
p=norm(Q(:,j)-Q(:,i));
Dp(c)=p-(R(i)+R(j));
else
% contact obstacle-particule
i=contact(c,1);
l=contact(c,3);
% zone ou se trouve la part i par rapport a l'obst l
if (Q(:,i)-Obs(1:2,l))'*(Obs(1:2,l)-Obs(3:4,l))>0
% la part est dans la zone 1
p=norm(Q(:,i)-Obs(1:2,l));
Dp(c)=p-R(i);
elseif (Q(:,i)-Obs(3:4,l))'*(Obs(3:4,l)-Obs(1:2,l))>0
% la part est dans la zone 2
p=norm(Q(:,i)-Obs(3:4,l));
Dp(c)=p-R(i);
else
pro_scal=(Q(:,i)-Obs(1:2,l))'*(N(:,l));
if pro_scal>0
% la part est dans la zone 3
Dp(c)=pro_scal-R(i);
else
% la part est dans la zone 4
Dp(c)=-pro_scal-R(i);
end
end
end
end
Dmin=min(Dp);
end
Thank you.

回答(1 个)

Daniel Shub
Daniel Shub 2012-5-23
Have you tried to profile your code to figure out where the bottleneck is? If comp is really big, you might be able to get a little speed up by not constructing the entire Dp matrix. You could do the comparison on the fly and only need the current Dp and Dmin.
Depending on what contact looks like, you might be recomputing components. The only dependency on c in your loop is in the construction of i and j (and i and l). If you do the calculations for individual pairs multiple times, that will slow you down.
Have you thought about a parfor or using the PCT?

类别

Help CenterFile Exchange 中查找有关 Audio Processing Algorithm Design 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by