我原以为理解并且会应用matlab绘制三维图,但动起手来,我发现各种不会,弄着弄着都有点怀疑人生了。首先,plot与plot3分别绘制二维与三维的曲线,而不是曲面,这是我的一个误区!还有,当你有x,y,z数据(行向量或者列向量)时,直接用surf(x,y,z)会给你报错,说z为矩阵的提示。还好,我在网上找到一篇博客,讲到此问题,帮我顺利解决难题,感谢笔芯!原因是:
【Matlab】离散点绘制三维曲面方法小结 - Find your love - CSDN博客 https://blog.csdn.net/shanchuan2012/article/details/72772191
以上就是我不能直接用surf的原因了。
解决方法:
1.
%确定网格坐标(x和y方向的步长均取0.1)
[X,Y]=meshgrid(min(x):0.1:max(x),min(y):0.1:max(y));
meshgrid是MATLAB(一款应用软件)中用于生成网格采样点的函数。在使用MATLAB进行3D图形绘制方面有着广泛的应用。
[X,Y] = meshgrid(x,y)
解释:输出X的每一行的数值都是复制的x的值;输出Y的每一列的数值都是复制的y的值。
meshgrid_百度百科 https://wapbaike.baidu.com/item/meshgrid/3794127?fr=aladdin&ms=1&rid=7297986572924445218
2.
%在网格点位置插值求Z,注意:不同的插值方法得到的曲线光滑度不同
Z=griddata(x,y,z,X,Y,'v4');
ZI = griddata(x,y,z,XI,YI) 调整形如z = f(x,y)的曲面,使之与非等间距矢量(x,y,z)中的数据吻合。griddata 函数在指定的(XI,YI)点处插补此曲面,生成ZI.
此曲面一定通过这些数据点。 XI 和 YI 通常构成均匀网格(与meshgrid函数生成的相同). XI 可以是行矢量,这种情况下该矢量确定一个具有固定列数的矩阵。与之类似,YI 可以是列矢量,确定一个具有固定行数的矩阵。
[XI,YI,ZI] = griddata(x,y,z,XI,YI) 函数返回与上述矩阵相同的插补后的矩阵ZI。并返回由行矢量XI和列矢量yi形成的矩阵XI 和YI. 后者与meshgrid 函数返回的矩阵相同。
[...] = griddata(...,method)使用规定的插补方法:
'linear' 基于三角形的线性插补法(缺省)
'cubic' 基于三角形的三次插补法
'nearest' 最近邻居插补法
'v4' MATLAB 4 griddata方法。
这些方法定义了匹配数据点的曲面类型。'cubic' 和 'v4' 方法生成平滑曲面,而 'linear' 和 'nearest' 分别具有一阶导数和零阶导数不连续。除'v4' 外所有方法基于数据的三角化。如果方法为[], 则使用缺省的'linear' 方法。
griddata_百度百科 https://wapbaike.baidu.com/item/griddata/3922116?fr=aladdin&ms=1&rid=7053847170498709362&sc_id=G10EwzC
3.
%绘制曲面
figure(1)
surf(X,Y,Z);
4.
shading interp;
matlab函数——shading函数 - 细水长流 - CSDN博客 https://blog.csdn.net/qq_27561265/article/details/48267579
5.
colormap(jet);
查看并设置当前颜色图 - MATLAB colormap - MathWorks 中国 https://ww2.mathworks.cn/help/matlab/ref/colormap.html
要是绘制散点图,可以用scatter函数,不用连成曲线,而是单独的点
https://www.baidu.com/link?url=GnEJwgc1YDjEaYRitf5s4pT7qLOxtEE7V3QcgWqHJmgLerUCGZmGSdd65Ycqk8DNyYHph6r7fGj5QF-5MmQgia&wd=&eqid=fc645bb800023ac5000000035c8b92d3