How to improve performance of code ?

Hello all, I am using this code for getting the data point coordinates among defined vertices .
ver = vertice; % nX3 matrix
ver=ceil(ver);
tess=delaunay(ver);
mn_x=min(ver(:,1));
mx_x=max(ver(:,1));
mn_y=min(ver(:,2));
mx_y=max(ver(:,2));
mn_z=min(ver(:,3));
mx_z=max(ver(:,3));
[X,Y,Z]=ndgrid(mn_x:0.8:mx_x , mn_y:0.8:mx_y , mn_z:0.8:mx_z);
sz=size(X);
P=ones(sz(1)*sz(2)*sz(3),3);
for i=1:sz(1)*sz(2)*sz(3)
P(i,1)=X(i);
P(i,2)=Y(i);
P(i,3)=Z(i);
end
pts=zeros(size(P));
for j=1:length(P)
t=tsearchn(ver,tess,P(j,:));
isin=~isnan(t);
if isin ==1
pts(j,:)=P(j,:);
end
end
It works fine but takes a lot time to calculate. How to improve the performance of code ? Thank you :)

4 Comments

yogesh - please quantify what you mean by it takes a lot of time. What are the dimensions of vertice? Is delaunay a function built-in to MATLAB (see http://www.mathworks.com/help/matlab/ref/delaunay.html) or something that you have written?
yogesh jain
yogesh jain on 29 Feb 2016
Edited: yogesh jain on 29 Feb 2016
Hello mr. Geoff , 1. Takes a lot time straightly tells that the computation time is more, it should be minimized . 2. 'n' here is no. of vertices , could be more . 3. Absolutely delaunay is inbuilt function of MATLAB, which creates a 2-D or 3-D Delaunay triangulation of the points.
Thank you :)
@yogesh jain: It matters if you are talking about day or micro-seconds. n might be 1e3 or 1e10, so please be specific and do not let us guess the details.
for the value of n=about 100 , it takes 50-55 seconds .

Sign in to comment.

 Accepted Answer

Please use the profile to find the bottleneck of the code. Some parts are easy to accelerate, but this does not really help, if they take 1% of the total time. E.g.:
P=ones(sz(1)*sz(2)*sz(3),3);
for i=1:sz(1)*sz(2)*sz(3)
P(i,1)=X(i);
P(i,2)=Y(i);
P(i,3)=Z(i);
end
Faster:
P = [X(:), Y(:), Z(:)];

4 Comments

Thanks but the part of the code which cosumes most of the time is -
pts=zeros(size(P));
for j=1:length(P)
t=tsearchn(ver,tess,P(j,:));
isin=~isnan(t);
if isin ==1
pts(j,:)=P(j,:);
end
end
This should be improved . thank you
And is the main part of the time spent inside tsearchn? Do I see it correctly that inside this function the convex hull is obatined in each iteration? Did you try to call it once with the matrix P?
Yes Mr. Jan "tsearchn" consumes the most time and it is obtaining convexhull in each iteration. thank you
As Jan suggested, rather than calling TSEARCHN multiple times with one row at a time call it with a matrix as the third input and perform all your searches at once. Then check which of the points are outside the convex hull and which are inside and process each group appropriately.

Sign in to comment.

More Answers (0)

Categories

Asked:

on 26 Feb 2016

Commented:

on 29 Feb 2016

Community Treasure Hunt

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

Start Hunting!