# how to create a matrix when using surf function？

2 views (last 30 days)

Commented: 博 王 on 20 Jan 2022
I want to solve this problem： figure(1);
[u,v]=meshgrid(-40:1:40);
D1=sqrt((u-40)^2+v^2);
D2=sqrt((u+40)^2+v^2);
if (D1<=40)&(D2<=40)
F=0;
else
F=1;
end
surf(u,v,F);
however, in this way, matlab tells me ''

Z 必须为矩阵，不能是标量或向量。''
how can I use surf correctly?

Voss on 18 Jan 2022
What you are doing there is making F a scalar, but F needs to be a matrix the same size as u and v, so something like this:
F = ones(size(u));
F(D1 <= 40 & D2 <= 40) = 0;
Here logical indexing is used to set the value of F based on conditions involving D1 and D2.

Thank you for you help. "F needs to be a matrix the same size as u and v" is really helpful. However, when I use this code:
F(D1 <= 40 & D2 <= 40) = 0;
I find it does not work.
So I change it this way.
figure(1);
[u,v]=meshgrid(-80:1:80);
F = ones(size(u));
for j=1:160
for i=1:160
D1=sqrt((i-80-40)^2+(j-80)^2);
D2=sqrt((i-80+40)^2+(j-80)^2);
if (D1<=80 & D2<=80)
F(i,j)=0;
else
F(i,j)=1;
end
end
end
surf(u,v,F);
and the result is shown in figure. But I think there is a better way to realize it especially for the part of "i j". Can you give me some advice.

R2020a

### Community Treasure Hunt

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

Start Hunting!