Matlab中meshgrid、contour函数疑问:如何构建Z矩阵绘制等高线
解决Matlab中meshgrid与contour绘图的Z矩阵构建问题
先修正你的循环代码
你给出的循环存在索引错误,x(n)、y(n)会把所有元素都赋值为最后一个i的值,正确写法如下:
n = 5; % 替换成你的实际n值 x = zeros(1, n); y = zeros(1, n); z = zeros(1, n); for i = 1:n x(i) = i; % 用i作为索引逐个赋值 y(i) = i; z(i) = rand(); end
两种数据场景的Z矩阵构建方法
场景1:x、y是规则网格的轴采样向量
如果x是x轴上的全部采样点,y是y轴上的全部采样点,meshgrid(x,y)会生成二维网格矩阵X、Y——X的每一行都是x向量,Y的每一列都是y向量,每个(X(i,j), Y(i,j))对应一个网格点。
此时Z需要是和X、Y同维度的二维矩阵,每个Z(i,j)对应(X(i,j), Y(i,j))这个网格点的函数值。正确做法是直接基于网格矩阵计算Z,而非先生成一维z:
xvec = 1:n; % x轴采样向量 yvec = 1:n; % y轴采样向量 [X,Y] = meshgrid(xvec, yvec); % 替换成你的实际函数逻辑,比如Z = X.*Y + rand(size(X)) Z = X + Y + rand(size(X)); % 绘制等高线图 contour(X, Y, Z);
场景2:x、y、z是离散散点数据
如果循环生成的是n个随机离散点(而非规则网格的轴采样),需要用插值方法把散点转换成规则网格的Z矩阵,使用griddata函数即可:
% 假设已有正确生成的一维x、y、z向量 % 定义目标网格的采样密度 x_grid = linspace(min(x), max(x), 50); % 生成50个x方向网格点 y_grid = linspace(min(y), max(y), 50); % 生成50个y方向网格点 [X,Y] = meshgrid(x_grid, y_grid); % 插值得到网格点对应的Z值 Z = griddata(x, y, z, X, Y); % 绘制等高线图 contour(X, Y, Z);
核心要点
meshgrid的作用是把一维轴采样向量转换成二维网格坐标矩阵,必须配合同维度的二维Z矩阵,才能使用contour、surf等绘图函数- 规则网格场景下,直接基于
X、Y计算Z效率最高;散点场景下,插值补全网格数据是可行方案
内容的提问来源于stack exchange,提问作者Lemonbonbon
相关产品推荐
相关产品推荐

