patternMinor
What's the fastest way to get the points I want out of a huge blob?
Viewed 0 times
wantthewhatpointswayhugegetfastestblobout
Problem
In MATLAB I have a set of 5393280 points in the form of a decimal-valued vector (x,y,z). How do I represent them in a way that I can quickly collect all the points within some rectangular x-y domain?
Right now I'm representing them as a 3-column matrix, sorted by x-values, and using the following code to extract a rectangular region:
However, I suspect that this is slowing my code down considerably.
What is a better way?
Right now I'm representing them as a 3-column matrix, sorted by x-values, and using the following code to extract a rectangular region:
mtx_region = mtx_pointList( dxLowerBound mtx_pointList(:,1) & ...
dyLowerBound mtx_pointList(:,2), : );However, I suspect that this is slowing my code down considerably.
What is a better way?
Solution
Prefiltering all relevant x-values with a binary search could speed up the process.
Binary search on sorted arrays is already discussed here.
[a,A]=myFind2(mtx_region(:,1),dxLowerBound,dxUpperBound);
xpoints=mtx_region(a:A,:);
mtx_region = xpoints( dyLowerBound xpoints(:,2), : );Binary search on sorted arrays is already discussed here.
function [b,c]=myFind2(x,A,B)
a=1;
b=numel(x);
c=1;
d=numel(x);
while (a+1<b||c+1<d)
lw=(floor((a+b)/2));
if (x(lw)<A)
a=lw;
else
b=lw;
end
lw=(floor((c+d)/2));
if (x(lw)<=B)
c=lw;
else
d=lw;
end
end
endCode Snippets
[a,A]=myFind2(mtx_region(:,1),dxLowerBound,dxUpperBound);
xpoints=mtx_region(a:A,:);
mtx_region = xpoints( dyLowerBound < xpoints(:,2) & ...
dyUpperBound > xpoints(:,2), : );function [b,c]=myFind2(x,A,B)
a=1;
b=numel(x);
c=1;
d=numel(x);
while (a+1<b||c+1<d)
lw=(floor((a+b)/2));
if (x(lw)<A)
a=lw;
else
b=lw;
end
lw=(floor((c+d)/2));
if (x(lw)<=B)
c=lw;
else
d=lw;
end
end
endContext
StackExchange Code Review Q#39409, answer score: 3
Revisions (0)
No revisions yet.