Z must be a matrix, not a scalar or vector.
1 view (last 30 days)
Show older comments
Hello,
I would like to turn the figure drawn by this code:
t = linspace(-10,10,1000);
xt = exp(-t./10).*sin(5*t);
yt = exp(-t./10).*cos(5*t);
p = plot3(xt,yt,t);
Which gives this
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/530149/image.png)
To a figure with a filled surface, like one can do with surf, like so:
[X,Y] = meshgrid(1:0.5:10,1:20);
Z = sin(X) + cos(Y);
surf(X,Y,Z)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/530154/image.png)
But,
surf(xt,yt,t);
gives this error: "Z must be a matrix, not a scalar or vector."
Thanks for your support
0 Comments
Answers (1)
Just Manuel
on 24 Feb 2021
Well, have a look, what X, Y and Z are that allow you to make a surface.
Meshgrid gives you matrices for X and Y, thus Z is also a matrix (20 by 19 in your example).
You need to specify height values in t, so express it as a function of X and Y.
Cheers
Manuel
2 Comments
Just Manuel
on 2 Mar 2021
Edited: Just Manuel
on 2 Mar 2021
Try something along the lines of
[X,Y] = meshgrid(-2:0.2:2,-2:0.2:2);
[phi,r] = cart2pol(X,Y);
Z = -10.*log(r);
surf(X,Y,Z)
Which yields this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/535901/image.png)
Or even better: use the approach from this answer:
r = 0.5:0.1:2;
phi = 0:0.1:2*pi;
[R,PHI] = meshgrid(r,phi);
Z = -10.*log(R);
surf(R.*cos(PHI), R.*sin(PHI), Z)
Which yields this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/535906/image.png)
And please accept the answer, if it was of use to you.
Cheers
Manuel
See Also
Categories
Find more on Graphics Performance in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!