4.0

4.0 | 3 ratings Rate this file 22 Downloads (last 30 days) File Size: 1.62 KB File ID: #25277
image thumbnail

xyzplotter

by

 

10 Sep 2009 (Updated )

Transforms lists xin,yin,zin into matrices which can be used with the functions surf and mesh.

| Watch this File

File Information
Description

This file has been updated for a MUCH faster version on large arrays (100k elements plus).

Enjoy.

MATLABs most commonly used 3-d plotting tools surf and mesh require rectangular grids to plot in 3-d, not x,y,z triples. This function converts arrays of x,y,z triples into rectangular grids to use with surf, mesh, etc.

common usage:
[x y z] = xyzplotter(xin,yin,zin)

xin,yin,zin are n x 1 arrays that define your surface. So xin(1),yin(1),zin(1) is the first point in your surface, etc. They do not need to be in any particular order.

Missing values in the grid will be filled in with NaNs. If you would like to interpolate the NaNs, I suggest inpaint_nans, file exchange number 4551. Here is the link:
http://www.mathworks.com/matlabcentral/fileexchange/4551

Andrew Stephens contributed some good ideas to this code, mostly accumarray() and unique() which I didn't know existed before. For now I would like to acknowledge his generous contribution.

MATLAB release MATLAB 7.13 (R2011b)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (4)
23 May 2012 Slaven  
25 Apr 2010 Andrew

Thank you! What a silly omission by Matlab not to have a function that does this. Considering Matlab is mostly for people with data to crunch, and that x,y,z format is pretty common, it's hardly even spoken about in the help files. One overly involved method is to use meshgrid and griddata.m, and that crashes if you don't want a new x,y data grid.

16 Sep 2009 Jack Kohoutek

I have a version running that uses accumarray as mentioned instead of the triple loop to fill the grid. However, the current result is that it takes 50 ms longer (out of 500) to run on my 3000 element test dataset. If anyone has a huge dataset they would like to send me to try with it, say, 10^5 elements or so, I would like to do that first since the method is a little less straightforward to follow in the code. I don't know what the demand is for datasets this large either. My email can be found in my profile.

10 Sep 2009 Andrew Stevens

This code worked fine for the example that I tried. Here are a couple comments and questions that I think, if addressed, will improve the code and clarify its function.

1)The help section is in a non-standard format and an H1 line would be useful.
2) What does the code do with repeat x and y values?
3) What is the cell-size of the resulting grid? Answers to 2 and 3 should be added to the help section.
4) Efficiency: This code uses a triple loop to fill the grid. For large datasets, this will be extremely slow. An alternative approach is to use a combination of HISTC and ACCUMARRAY to populate the grid that will be fast.

-Andrew

Updates
14 Sep 2009

Addressed numbers 1-3 of the first comment. Thank you very much for the rating and feedback!

21 Sep 2009

Updated code for a very large speed increase with more random datasets, thanks to some help from Andrew Stephens.

05 Mar 2012

This file has been updated for a MUCH faster version on large arrays (100k elements plus). Please see:

http://www.mathworks.com/matlabcentral/fileexchange/35428

Enjoy.

12 Mar 2012

This version is orders of magnitude faster than the last version, especially on large arrays.

Contact us