为什么MATLAB绘制3D网格图时要求Z参数为矩阵而非向量?
MATLAB mesh函数报错与meshgrid作用原理解答
1. 报错核心原因
该报错的本质是混淆了3D网格曲面绘图和3D散点绘图的参数要求:
mesh是专门用于绘制网格化曲面的函数,要求输入的Z参数必须为二维矩阵,Z(i,j)对应X轴第i个坐标、Y轴第j个坐标处的曲面高度,需要覆盖整个XY平面所有网格交点的高度数据,而非单条线上的离散点数据。- 你认知中「传入(x,y,z)三元组列表即可渲染」是
scatter3这类散点绘图函数的逻辑,和mesh的功能定位完全不同。
2. meshgrid 函数的作用
meshgrid的核心价值是将一维的x、y坐标向量,扩展为覆盖整个XY平面的二维网格坐标矩阵:
假设输入x = [x₁,x₂,…,xₙ](长度为n的行向量),y = [y₁,y₂,…,yₘ](长度为m的行向量),执行[X,Y] = meshgrid(x,y)后:
- 输出
X为m行n列矩阵,每一行都完整复制x向量的所有元素 - 输出
Y为m行n列矩阵,每一列都完整复制y向量的所有元素
此时X(i,j)和Y(i,j)刚好对应XY平面上第j个x坐标、第i个y坐标的交点位置,基于这两个矩阵运算得到的Z也会是m行n列的二维矩阵,完全匹配mesh的参数要求。
以你给出的示例代码为例,x、y的长度均为161(从-8到8步长0.1,共(8-(-8))/0.1 +1=161个元素),经过meshgrid处理后X、Y均为161×161的矩阵,运算得到的Z同样是161×161的矩阵,传入mesh即可正常渲染完整的sin(R)/R曲面。
3. 错误代码的问题所在
省略meshgrid后直接执行r=sqrt(x.^2+y.^2)+eps属于MATLAB的向量逐元素运算,只会将x和y对应位置的元素分别计算,得到的r是长度为161的一维行向量,仅对应x=y这条对角线上的点的半径值,最终计算得到的z也为一维向量,仅包含161个对角线上的高度值,完全没有覆盖整个XY平面的所有网格点,不符合mesh对Z为二维矩阵的要求,因此抛出对应报错。
如果仅需要绘制你当前计算得到的对角线上的点,可以改用scatter3(x,y,z)执行,不会触发报错,只是最终呈现的是空间中的一条曲线散点,而非完整的3D曲面。
内容的提问来源于stack exchange,提问作者Sayan Dutta
相关产品推荐
相关产品推荐

