This file has been updated for a MUCH faster version on large arrays (100k elements plus).
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.
[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:
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.
Jack Kohoutek (2020). xyzplotter (https://www.mathworks.com/matlabcentral/fileexchange/25277-xyzplotter), MATLAB Central File Exchange. Retrieved .
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.
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.
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.
This version is orders of magnitude faster than the last version, especially on large arrays.
This file has been updated for a MUCH faster version on large arrays (100k elements plus). Please see:
Updated code for a very large speed increase with more random datasets, thanks to some help from Andrew Stephens.
Addressed numbers 1-3 of the first comment. Thank you very much for the rating and feedback!