File Exchange ## Equally spaced structured Point Cloud Cuboid generation

version 1.0.0.0 (1.32 KB) by Jveer

### Jveer (view profile)

Simple function to generate equally spaced point cloud forming a cuboid

Updated 04 Apr 2009

Inputs are vectors giving the x, y and z range. e.g x=1:100;y=40:70;z=80:250;

Apologies for lack of description but this submission is for a specific request. It is an extract from a much larger program.

% - B.I SOLID POINT CLOUD CUBOID
function [P]=Cuboid(x,y,z)
% - Generates coordinates for a solid cuboid composed of points

a=length(x);b=length(y);c=length(z); % assigning for coding simplicity
% B.I.1. Finding all x coordinates
xp=zeros(1,a*b*c); % preallocating
for nx=1:a
if nx==1,xp(1:c*b)=(repmat(x(nx),1,c*b));
else xp(((nx-1)*c*b)+1:nx*c*b)=repmat(x(nx),1,c*b);end
end
% B.I.2. Finding all y coordinates
yp=zeros(1,b*c); % preallocating
for ny=1:b
if ny==1,yp(1:c)=repmat(y(ny),1,c);
else yp(((ny-1)*c)+1:ny*c)=repmat(y(ny),1,c);
end
end
yp=repmat(yp,1,a);
% B.I.3. Finding all z coordinates
zp=repmat(z,1,b*a);
% B.I.4. Coordinates of the cuboid generated.
P=[xp;yp;zp];
end % To Optimize

Jveer

### Jveer (view profile)

@ Tilak

First, apologies for the late reply.

I disagree with your above comparison with meshgrid.

Consider the following:

function [P]=Test

tic

% % Meshgrid
[xp,yp,zp]=meshgrid(xp,yp,zp);
xp=reshape(xp,[],1);yp=reshape(yp,[],1);zp=reshape(zp,[],1);
P=[xp(:),yp(:),zp(:)];

toc

end

----> Proof that the results are disimilar
>> P=Test;
Elapsed time is 0.247434 seconds.
>> tic;P1=Cuboid(xp,yp,zp);toc
Elapsed time is 0.769585 seconds.
>> isequal(P1',P)

ans =

0

----> For similar results
function [P]=Test

tic

% % Meshgrid
[xp,yp,zp]=meshgrid(xp,yp,zp);
P=[xp(:),yp(:),zp(:)];
P=unique(P,'rows');

toc

end

---> Proof that Cuboid is faster
>> P=Test;
Elapsed time is 4.109277 seconds.
>> tic;P1=Cuboid(xp,yp,zp);toc
Elapsed time is 0.755397 seconds.
>> isequal(P1',P)

ans =

1

----> Cuboid=mesgrid+unique ==> to generate a structured point cloud Cuboid is still way faster.

Tilak Rajesh

### Tilak Rajesh (view profile)

Here is a faster version compared with the Cuboid()

%%
clear
for i=1:100
tic
[P]=Cuboid([-1:0.1:1],[-2:0.1:2],[-3:0.1:3]);
%plot3(P(1,:),P(2,:),P(3,:),'*')
toc
end
%Approx worst case: Elapsed time is 0.006052 seconds.
%%
clear
for i=1:100
tic
[x,y,z]=meshgrid([-1:0.1:1],[-2:0.1:2],[-3:0.1:3]);
x=reshape(x,[],1);y=reshape(y,[],1);z=reshape(z,[],1);
%plot3(x,y,z,'*')
toc
end
%Approx worst case: Elapsed time is 0.001026 seconds.

Both code produce the same result but using meshgird is much faster. I find it interesting as to how gather lots of points in the cloud, especially when there is OUT OF MEMORY issues.
for example: [x,y,z]=meshgrid([-1:0.001:1],[-1:0.001:1],[-1:0.001:1]); gives OUT OF MEMORY.
I am thinking of taking only X and Y using meshgrid and using this to create slices of the cube in the x-y plane. Any better ways to overcome the OUT OF MEMORY problems ?

Jveer

### Jveer (view profile)

Communications blockset not required! i don't remember putting that there!

if anyone manages to speed up this function, please let me know.

##### MATLAB Release Compatibility
Created with R2007a
Compatible with any release
##### Platform Compatibility
Windows macOS Linux