文章目录
- 前言
- 一、Matlab插值
-
- 1.Meshgrid函数
- 2.Griddata函数
- 二、绘制
-
- 1.使用函数
-
- (1)linspace函数
- (2)peaks函数
- (3)polt3函数
- (4)mesh函数
- (5)surf函数
- (6)contour函数
- 2.步骤
-
- (1)常见数学函数绘图
- (2)离散数据绘图
- 引用出处
前言
最近需要用到Matlab来绘制三维的地形图等,即通过已知的山地海拔数据,利用Matlab软件使用插值法绘制三维曲面图、等高线图。
一、Matlab插值
插值就是在已知数据之间计算估计值的过程,是一种实用的数值方法,是函数逼近的重要方法。在信号处理和图形分析中,插值运算的应用较为广泛。而matlab中常用的有interp,meshgrid,griddata等函数。
我在这里仅使用meshgrid和griddata函数,关于Matlab插值的其他方法,有兴趣可以看 Matlab 之meshgrid, interp, griddata 用法和实例(转).以及Matlab中插值函数汇总和使用说明。
1.Meshgrid函数
Meshgrid用于从数组a和b产生网格,生成用于画三维图形的矩阵数据。生成的网格矩阵A和B大小是相同的。它也可以是更高维的。这里的大小指的是,size()函数的大小,size()函数返回的是一个向量, 那么size(A) = size(B)。
[A,B]=meshgrid(a,b)
生成size(b)Xsize(a)大小的矩阵A和B。它相当于a从一行重复增加到size(b)行,把b转置成一列再重复增加到size(a)列。
meshgrid 和 mesh 方法的差别在于是否会画出栅格线。
生成绘制3D图形所需的网格数据。因为在计算机中进行绘图操作时,往往需要一些采样点,然后根据这些采样点来绘制出整个图形。
涉及到a、b这两组数据可以看做是在 Oxy 平面内对坐标进行采样得到的坐标对(a, b)。1
解释:输出 X 的每一行的数值都是复制的x的值;输出 Y 的每一列的数值都是复制的y的值。
所以,若x-1xm维, y-1xn维,则[X,Y]为 mxn 维
也就是说,在 XOY 平面上,用m个x和n个y,通过不断做垂线,产生交点从而生成小的矩形网格的方法,生成网格图。
[X,Y]=meshgrid(x) 与 [X,Y]=meshgrid(x,x) 是等同的
2.Griddata函数
用二元函数z=f(x,y)的曲面拟合有不规则的数据向量x,y,z。griddata 将返回曲面z 在点(XI,YI)处的插值。曲面总是经过这些数据点(x,y,z)的。输入参量(XI,YI)通常是规则的格点(像用命令meshgrid 生成的一样)。XI 可以是一行向量,这时XI 指定一有常数列向量的矩阵。类似地,YI 可以是一列向量,它指定一有常数行向量的矩阵。
格式:
(1)
vq = griddata(x,y,v,xq,yq)
vq = griddata(x,y,v,xq,yq) 使 v = f(x,y) 形式的曲面与向量 (x,y,v) 中的散点数据拟合。griddata 函数在 (xq,yq) 指定的查询点对曲面进行插值并返回插入的值 vq。曲面始终穿过 x 和 y 定义的数据点。
(2)
vq = griddata(x,y,z,v,xq,yq,zq)
vq = griddata(x,y,z,v,xq,yq,zq) 拟合 v = f(x,y,z) 形式的超曲面。
(3)
vq = griddata(___,method)
vq = griddata( ,method) 使用上述语法中的任何输入参数指定计算 vq 所用的插值方法。method 可以是 ‘linear’、‘nearest’、‘natural’、‘cubic’ 或 ‘v4’。默认方法为 ‘linear’。
详细使用方法参考官网帮助中心griddata函数。
二、绘制
1.使用函数
(1)linspace函数
用法:linspace(x1,x2,n)
功能:linspace是Matlab中的一个指令,用于产生x1,x2之间的n点行矢量(生成线性间距向量)。其中x1、x2、n分别为起始值、中止值、元素个数。若缺省n,默认点数为100。
y = linspace(x1,x2)
返回包含 x1 和 x2 之间的 100 个等间距点的行向量。
y = linspace(x1,x2,n)
生成 n 个点。这些点的间距为 (x2-x1)/(n-1)。
linspace 类似于冒号运算符“:”,但可以直接控制点数并始终包括端点。
(2)peaks函数
MATLAB 提供了一个 peaks 函数(包含两个变量的示例函数),可产生一个凹凸有致的曲面,包含了三个局部极大点及三个局部极小点,其本质是二元高斯分布的概率密度函数。
语法2
Z = peaks;
Z = peaks(n);
Z = peaks(V);
Z = peaks(X,Y);
peaks(…)
[X,Y,Z] = peaks(…);
说明:
peaks 是从高斯分布转换和缩放得来的包含两个变量的函数,在演示 mesh、surf、pcolor、contour 等函数中很有用。
Z = peaks; 返回一个 49×49 矩阵。
Z = peaks(n); 返回一个 n×n 矩阵。
Z = peaks(V); 返回一个 n×n 矩阵,其中 n = length(V)。
Z = peaks(X,Y); 在给定的 X 和 Y(必须大小相同)处计算 peaks 并返回大小相同的矩阵。
peaks(…)(无输出参数)使用 surf 绘制 peaks 函数。使用先前语法中的任意输入参数组合。
[X,Y,Z] = peaks(…); 返回另外两个矩阵 X 和 Y 用于参数绘图,例如 surf(X,Y,Z,del2(Z))。如未作为输入参数给出,基础矩阵 X 和 Y 是
[X,Y] = meshgrid(V,V)
其中 V 是给定向量,或者 V 是长度为 n 的向量,其元素从 -3 到 3 均匀间隔。如果未给出输入参数,默认的 n 是 49。
peaks
%默认n为49
生成图像及函数如下:
(3)polt3函数
plot3函数只能绘制出三维的曲线,并不能绘制出三维曲面。
plot3(X,Y,Z)
plot3(X,Y,Z) 绘制三维空间中的坐标。
要绘制由线段连接的一组坐标,请将 X、Y、Z 指定为相同长度的向量。
要在同一组坐标轴上绘制多组坐标,请将 X、Y 或 Z 中的至少一个指定为矩阵,其他指定为向量。
plot3(X,Y,Z,LineSpec)
plot3(X,Y,Z,LineSpec) 使用指定的线型、标记和颜色创建绘图。
如官方案例:
%创建两组 x、y 和 z 坐标。
t = 0:pi/500:pi;
xt1 = sin(t).*cos(10*t);
yt1 = sin(t).*sin(10*t);
zt1 = cos(t);xt2 = sin(t).*cos(12*t);
yt2 = sin(t).*sin(12*t);
zt2 = cos(t);
%调用 plot3 函数,并指定连续的 XYZ 三元组。
plot3(xt1,yt1,zt1,xt2,yt2,zt2)
(4)mesh函数
使用mesh函数可以生成三维网格曲面图(mesh即网格,网状物)。
meshc:网格曲面图下的等高线图,用法同mesh。
meshz:带帷幕的网格曲面图,用法同mesh。
语法:
mesh(X,Y,Z)
mesh(X,Y,Z) 创建一个网格图,该网格图为三维曲面,有实色边颜色,无面颜色。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。边颜色因 Z 指定的高度而异。
mesh(Z)
mesh(Z) 创建一个网格图,并将 Z 中元素的列索引和行索引用作 x 坐标和 y 坐标。
mesh(Z,C)
mesh(Z,C) 进一步指定边的颜色。
(5)surf函数
surf:三维着色曲面图
surfc:三维着色曲面图下的等高线图
surfl:具有基于颜色图的光照的三维着色曲面图
其中surfl如下图,在图中以XOY面为向光面,用高亮(橙)黄色标出,光线照射不到的地方即背阴处用蓝色着色。
语法:
surf(X,Y,Z)
surf(X,Y,Z) 创建一个三维曲面图,它是一个具有实色边和实色面的三维曲面。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。曲面的颜色根据 Z 指定的高度而变化。
surf(X,Y,Z,C)
此外,surf(X,Y,Z,C) 还指定曲面的颜色。
surf(Z)
surf(Z) 创建一个曲面图,并将 Z 中元素的列索引和行索引用作 x 坐标和 y 坐标。
(6)contour函数
contour:矩阵的二维等高线图
contour3:三维等高线图
contourf:填充的二位等高线图
contour(Z)
contour(Z) 创建一个包含矩阵 Z 的等值线的等高线图,其中 Z 包含 x-y 平面上的高度值。Matlab 会自动选择要显示的等高线。Z 的列和行索引分别是平面中的 x 和 y 坐标。
contour(X,Y,Z)
contour(X,Y,Z) 指定 Z 中各值的 x 和 y 坐标。
2.步骤
首先就是要进行数据处理,详细的来说就是要对数据进行处理,得到三维曲面上的点坐标组。
可以得到真实地形的高程数据来做出真实的三维地形曲面图,具体请看
三维地形图建模仿真。
(1)常见数学函数绘图
将函数通过三维来表示出来:
1.先将变量离散,如x=xmin:dx:xmax y=ymin:dy:ymax
2.使用meshgrid来创建网格矩阵
3.用z=f(x,y)来求出z
4.用mesh或者surf函数绘图。
例如画出函数z=x2+y2(mesh和surf都可以)
注意在matlab中.^2 是矩阵中的每个元素都求平方,^2是求矩阵的平方或两个相同的矩阵相乘。
x=-20:20
[X,Y]=meshgrid(x)
Z=X.^2+Y.^2
mesh(X,Y,Z)%如图所示
还有些画出来很有意思的函数如x2+y2=z2,z=25-x2-y2, z=25-sqrt(x2+y2),x2+y2+z2=25等等。
(2)离散数据绘图
再有就是获得地形数据或者离散数据我们该怎样去绘制
1.先将数据存入矩阵
2.读出数据(1.2.可省略)
3.对数据的x轴,y轴方向进行插值
4.用meshgrid生成网格矩阵
5.用griddata函数对数据进行拟合
6.用mesh或surf函数绘制
例如 得到数据如
1.486 3.059 0.1;2.121 4.041 0.1;2.570 3.959 0.1;3.439 4.396 0.1;4.505 3.012 0.1;3.402 1.604 0.1;2.570 2.065 0.1;2.150 1.970 0.1;
1.794 3.059 0.2;2.121 3.615 0.2;2.570 3.473 0.2;3.421 4.160 0.2;4.271 3.036 0.2;3.411 1.876 0.2;2.561 2.562 0.2;2.179 2.420 0.2;
2.757 3.024 0.3;3.439 3.970 0.3;4.084 3.036 0.3;3.402 2.077 0.3;
2.879 3.036 0.4;3.421 3.793 0.4;3.953 3.036 0.4;3.402 2.219 0.4;
3.000 3.047 0.5;3.430 3.639 0.5;3.822 3.012 0.5;3.411 2.385 0.5;
3.103 3.012 0.6;3.430 3.462 0.6;3.710 3.036 0.6;3.402 2.562 0.6;
3.224 3.047 0.7;3.411 3.260 0.7;3.542 3.024 0.7;3.393 2.763 0.7;
通过上述方法来执行
a=[1.486 3.059 0.1;2.121 4.041 0.1;2.570 3.959 0.1;3.439 4.396 0.1;4.505 3.012 0.1;3.402 1.604 0.1;2.570 2.065 0.1;2.150 1.970 0.1;
1.794 3.059 0.2;2.121 3.615 0.2;2.570 3.473 0.2;3.421 4.160 0.2;4.271 3.036 0.2;3.411 1.876 0.2;2.561 2.562 0.2;2.179 2.420 0.2;
2.757 3.024 0.3;3.439 3.970 0.3;4.084 3.036 0.3;3.402 2.077 0.3;
2.879 3.036 0.4;3.421 3.793 0.4;3.953 3.036 0.4;3.402 2.219 0.4;
3.000 3.047 0.5;3.430 3.639 0.5;3.822 3.012 0.5;3.411 2.385 0.5;
3.103 3.012 0.6;3.430 3.462 0.6;3.710 3.036 0.6;3.402 2.562 0.6;
3.224 3.047 0.7;3.411 3.260 0.7;3.542 3.024 0.7;3.393 2.763 0.7;];
x=a(:,1);
y=a(:,2);
z=a(:,3);
xtemp=linspace(min(x),max(x),100);
ytemp=linspace(min(y),max(y),100);
[X,Y]=meshgrid(xtemp,ytemp);
Z=griddata(x,y,z,X,Y,'v4');
mesh(X,Y,Z)%如图所示
若文章有错误或不妥之处,欢迎大家指正,谢谢 😃 。
引用出处
-
meshgrid ↩︎
-
peaks函数 ↩︎