Matlab来绘制三维曲面图、等高线图等_matlab三位等高线图研究意义-程序员宅基地

技术标签: matlab  矩阵  Matlab  


前言

最近需要用到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)%如图所示

在这里插入图片描述若文章有错误或不妥之处,欢迎大家指正,谢谢 。

引用出处


  1. meshgrid

  2. peaks函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangyilong153/article/details/112687501

智能推荐

初识sethc.exe进程-程序员宅基地

文章浏览阅读1.7k次。昨天手贱把administrator账户禁用了后来重启发现你的账户已被停用。请向系统管理员咨询! 本想着重启按F8进入安全模式用CMD命令解除administrator账户。于是无效,原来win10系统下安全模式模块已经放在更新与恢复下面。解决方法:1.进入PE系统修改sethc.exe进程,找到C:\Windows\system32路径下sethc.exe改为sethc.exe.bf_sethc.exe

ROS中使用自定义头文件和源文件的方法_ros中的头文件与源文件-程序员宅基地

文章浏览阅读3.4k次,点赞14次,收藏39次。自定义hello.h和hello.cpp文件,test_hello.cpp引用hello,对CmakeLists.txt进行配置:1. 存放头文件首先将头文件hello.hpp文件存放到功能包文件夹(test)下的include文件夹下的功能包名文件夹内:存放头文件(catkin_ws/src/test/include/test/hello.hpp)2.存放源文件将源文件hello.cpp..._ros中的头文件与源文件

cocoscreator3.x 用tiledMap趟坑_tmxtiledmap 不显示-程序员宅基地

文章浏览阅读1.6k次。问题:cocoscreator3.x 用tiledMap的时候不显示创建的地图,图块,图片没在同一个文件夹里,放到同一个文件夹里就显示了。_tmxtiledmap 不显示

Detect-and-Track: Efficient Pose Estimation in Videos(检测和追踪:视频中有效的姿态评估)论文解读-程序员宅基地

文章浏览阅读1.2k次。论文链接:https://arxiv.org/abs/1712.09184v1项目链接:https://github.com/facebookresearch/DetectAndTrack摘要文章解决的是复杂场景多人视频的人体关键点评估和追踪。作者提出了一种极其轻量但高效的方法,它建立在最新的人类检测和视频理解。该方法是两阶段方法:1,先在帧或短片上进行关键点估计;2,然后进行轻..._detect-and-track: efficient pose estimation in videos

vue+element UI 当前节点的向上所有父节点全部勾选,向下的所有子节点不进行勾选,并在文本框进行展示勾选内容,勾选时并隐藏下拉框_vxe-table的checkboxchange怎么写才能让父节点功能为全选,子节点向上选中父节点,-程序员宅基地

文章浏览阅读1.1k次。项目当中的需求实现自定义勾选树,当选择子节点的时候,当前节点的向上所有父节点全部勾选,向下的所有子节点不进行勾选,并在文本框进行展示勾选内容,勾选时并隐藏下拉框,鼠标放置文本框,出现清除按钮,点击清楚文本并重置树,并且需要记录当前勾选的标识,名称等节点信息。后端返回的树节点信息,到底有几层未知,数据量到底有多大未知。项目环境:vue+element UI 树(el-tree)<el-form class="sarch_container mt30" label-widt_vxe-table的checkboxchange怎么写才能让父节点功能为全选,子节点向上选中父节点,

【转】Spring+Netty+Protostuff+ZooKeeper实现轻量级RPC服务(二)_netty+protostuff 实现rpc通讯-程序员宅基地

文章浏览阅读1.4k次。接上文【转】Spring+Netty+Protostuff+ZooKeeper实现轻量级RPC服务 (二)整体文件结构 其中(Maven 的多模块构建): SpringMVC_RPC_Client SpringMVC_RPC_Common SpringMVC_RPC_Server SpringMVC_RPC_Service 服务接口工程 Spr_netty+protostuff 实现rpc通讯

随便推点

UART协议总结_uart握手-程序员宅基地

文章浏览阅读2.8k次。这篇总结下UART简介UART,Universal Asynchronous Receiver/Transmitter的简称,通用的异步收发传输器。有三根线,TX,RX,GND,拓扑如下:特点TX,RX在空闲时状态都为逻辑1先发送字节低位,再发送字节高位起始位:先发出一个逻辑0的信号,标识传输数据的开始。数据位:紧接起始位之后,数据位个数可以是7位、8位、9位长校验位:可选..._uart握手

CentOS 7 安装 MySQL 8-程序员宅基地

文章浏览阅读207次。CentOS 7 安装MySQL 81.下载2.解压1.下载打开 [MySQL 官方下载地址](https://downloads.mysql.com/archives/community/)选择我们要安装的版本 32位系统选择第一个 64位系统选择第二个2.解压创建 tar.xz 文件命令:tar cvf xxx.tar xxx/ 得到 xxx.tar文件,然后 xz ...

系统移植_操作系统移植要解决哪些问题-程序员宅基地

文章浏览阅读835次。嵌入式系统移植步骤时间:2018-01-25来源:未知在嵌入式系统移植中重要的一部分是操作系统的移植,与其它操作系统相比,Linux大的特点:它是一款遵循GPL的操作系统,我们可以自由地使用、修改、和扩展它。正是由于这一特色,嵌入式系统移植过程中Linux系统受到越来越多人士的青睐。于是,一个经常会被探讨的问题出现了,即关于Linux系统的移植。对于操作系统而言,这种移植通常是跨平..._操作系统移植要解决哪些问题

LWIP学习笔记(4)LWIP网络接口管理_lwip如何实现不同流走不同的网卡-程序员宅基地

文章浏览阅读811次。netif.c/h实现网络接口管理,完成对网卡的抽象描述,网卡初始化,网卡发送数据,网卡接收数据等网卡描述结构体struct netif(部分省略)netif.h定义了如下结构体struct netif { /** pointer to next in linked list *///指向下一个netif结构 struct netif *next; /** IP address ..._lwip如何实现不同流走不同的网卡

Vs2015 C++ 使用 导入 jsoncpp_vs2015 jsoncpp-程序员宅基地

文章浏览阅读1k次。首先下载 : jsoncpp下载地址:jsoncpp下载完后解压到指定目录:例如我放下了 E:\visual_studio_Projects然后打开vs,新建一个项目,或者使用现有的项目。例如,新建一个C++项目:项目创建完成之后,新建一个 text.cpp 文件,用于测试准备工作做完了。然后打开你解压好的 jsoncpp 的目录。把 ..._vs2015 jsoncpp

1115C语言实验——交换两个整数的值(顺序结构)_time limit :1000 ms memory limit :128 mb 提交 统计问题描述-程序员宅基地

文章浏览阅读257次。C语言实验——交换两个整数的值(顺序结构)Time Limit: 1000MS Memory Limit: 65536KBProblem Description交换两个变量的值,由终端输入两个整数给变量x、y,然后交换x和y的值后,输出x和y。 Input从键盘输入两个整数变量x和y; Output在交换x、y的值后将x和y输出! Example Inp_time limit :1000 ms memory limit :128 mb 提交 统计问题描述输入两个整数t1

推荐文章

热门文章

相关标签