optimize inefficient piece of code

Hi,
I have a piece of code as part of a bigger piece that is inefficient. The code is called many times and is a bottleneck in the proces also according to the matlab profiler. I feel it can be done faster. The code looks as follows
clear all
% initialize variables of interest
l1=rand(1,10);
l2=rand(1,10);
p1=rand(3,10);
p2=rand(3,10);
% start inefficient code
[c,ind]=min([l1;l2]);
r(:,:,1)=p1;
r(:,:,2)=p2;
for it=1:10
p3(:,it)=r(:,it,ind(it));
end
I would like to do the for loop in one go (so remove the for loop). l1 and l2 are distances (l1 is norm of p1 and l2 is norm of p2), and p1, p2 are 3d coordinates. The goal of the code is to pick the coordinates of p1, p2 from the one with the smallest distance.

1 Comment

Ican do something like this:
p31=p2.*([ind;ind;ind]-1)+p1.*~([ind;ind;ind]-1)
which results in a correct answer but it feels like a waste of memory and a lot of unnecessary operations.

Sign in to comment.

 Accepted Answer

Hi!
You can of course avoid the loop with
p3(1:3, ind==1) = p1(:, ind==1);
p3(1:3, ind==2) = p2(:, ind==2);
This avoids the r-lines before the loop as well. Use '~' instead of 'c' if you are not interessted in the value of the 'min' call.

4 Comments

Thanks, so far,
p31=p2.*([ind;ind;ind]-1)+p1.*~([ind;ind;ind]-1)
seems to be slightly faster. However,
p31=p2.*([ind;ind;ind]-1)+p1.*(2-[ind;ind;ind])
is even faster still. This tiny change saved another 50% cputime for this single line.
Hi!
How do you test your results?
My favourite at the moment is
p3 = p2;
p3(:, ind==1) = p1(:, ind==1);
But this might be due to the fact that I like logical indexing ;-)
Wesley Ooms
Wesley Ooms on 6 Jan 2014
Edited: Wesley Ooms on 6 Jan 2014
I run the (complete) code in profile viewer. I also use tic toc in a for loop. In both cases your code is indeed the fastest. Strangely the ~ instead of c makes the code slower.
I optimized allready quite a bit. Matlab functions i substituted to decrease cputime are for example circshift, repmat, cross, dot, mean. Why are these handy and very common functions slower than just straightforward implementing raw code?
I think because of the overhead, like checking the input for correct type and dimension and things like that. But that implies that you know what you do and what kind of input to your substitutes you have.

Sign in to comment.

More Answers (0)

Products

Asked:

on 6 Jan 2014

Commented:

on 7 Jan 2014

Community Treasure Hunt

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

Start Hunting!