# I can not create a 3D object with the following code

1 view (last 30 days)
Long on 29 Mar 2024
Commented: Long on 29 Mar 2024
%Generate a volume-swept 3D object
N = 40; %number of increments
z = linspace (-5,5,N);
theta = 2*pi*linspace(0,1,N);
Z = z(:,ones(1,N));% <-- Do not understand the code? Create a matrix Z?
surf(X,Y,Z)
Error using surf (line 71)
Z must be a matrix, not a scalar or vector.
axis equal
Error: Z is not a matrix

Cris LaPierre on 29 Mar 2024
Edited: Cris LaPierre on 29 Mar 2024
To create a surface, your Z input must contain a value for every X-Y combination organized in a grid (matrix). Columns correspond to X, rows correspond to y.
• Here, z is a row vector
• Z = z(:,ones(1,N)) is the same as z(:,[1 1 1 ... 1]) or repmat(z(:,1),1,N)
Use MATLAB to see what that code is doing:
N=4;
z = linspace (-5,5,N)
z = 1×4
-5.0000 -1.6667 1.6667 5.0000
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
z(:,ones(1,N))
ans = 1×4
-5 -5 -5 -5
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
repmat(z(:,1),1,N)
ans = 1×4
-5 -5 -5 -5
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
It just repeats the first value of your vector N times.
I think you are not getting the results you expect because z is a row vector, not a column vector. Perhaps this is what you intended?
N = 40; %number of increments
z = linspace (-5,5,N)'; % use ' to turn z into a column vector
theta = 2*pi*linspace(0,1,N);
Z = z(:,ones(1,N));% <-- Do not understand the code? Create a matrix Z?
surf(X,Y,Z)
axis equal
If you did intend for z to be a vector, you can use any 3D plotting functino to view it. Here is a result using scatter3.
%Generate a volume-swept 3D object
N = 40; %number of increments
z = linspace (-5,5,N);
theta = 2*pi*linspace(0,1,N);
Z = z(:,ones(1,N));% <-- Do not understand the code? Create a matrix Z?
scatter3(X,Y,Z)
axis equal
Long on 29 Mar 2024
I got it. Thanks a lot.