5 views (last 30 days)

Show older comments

I want to plot a 3D surface , but I cannot apply the surf() command straightforwardly for some reason.

I have two vectors for x and y coordinates. Let us say

x = linspace(-10, 10, 100);

y = linspace(-0.5, 0.5, 100);

To calzulate I have to call some function which works only for fixed values of x and y. Thys, I calculate it as follows

for i = 1 : length(x)

for j = 1 : length(y)

func(i,j) = @MyFunction(__some_parameters__, x(i), y(j));

end

end

As a result I have two vectors for x and y and a matrix of the size length(x)*length(y) for the variable z. Could you tell me please, if there are any convenient methods to rewrite this data to a format that is appropriate for applying the surf() command?

P.S. I used plot3(x(i), y(j), func(i,j), 'b.') with two cycles, but it is a ridiculous "dirty hack" and not a surface.

Walter Roberson
on 21 Oct 2021

Create full vectors of coordinates and arrayfun()

x = linspace(-10, 10, 100);

y = linspace(-0.5, 0.5, 100);

[X, Y] = meshgrid(x, y);

Z = arrayfun(@(xx,yy) sin(xx)+atan2(yy,xx), X, Y);

surf(x, y, Z, 'edgecolor', 'none')

Walter Roberson
on 22 Oct 2021

surf(x, y, z')

If that worked for your purposes, then chances are that when you constructed z, you varied x values down columns, and that you varied y values across rows -- that array z(J,K) is a function of x(J), y(K) . That is a very common data organization... but it is not the MATLAB data organization. In MATLAB, up/down (so, along columns) is y, and left/right (so, along rows) is x, and array location z(J,K) is z(y(J), x(K)) .

When you use meshgrid(xvector, yvector), then the coordinates are arranged in such a way that surf(x, y, z) works out.

When you use ndgrid(xvector, yvector) then the coordinates are arranged in such a way that surf(x, y, z) errors (unless xvector and yvector are the same length).

xvec = 1:2; yvec = 1:3

[X, Y] = meshgrid(xvec, yvec)

[X, Y] = ndgrid(xvec, yvec)

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

Start Hunting!