IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> matlab绘图:如何通过已知的散点的热量、高度绘制一张平面的分布图 -> 正文阅读

[数据结构与算法]matlab绘图:如何通过已知的散点的热量、高度绘制一张平面的分布图

????????以2021年美赛MCM赛题B题为例,对于这个题目分析的后续算法暂且不论,我们需要将问题可视化,即将澳大利亚各个地点的热量信息化成一张分布图。数据可以参考以下网址:????????Fires from Space: Australia | Kaggleicon-default.png?t=M1L8https://www.kaggle.com/carlosparadis/fires-from-space-australia-and-new-zeland????????以下是我们得到的信息状态:

?

? ? ? ? ?很明显信息状态分为四个值:经度、纬度、亮度、置信度。我们需要对这些信息进行处理,经纬度转化成x-y(以1km为度量)坐标系,亮度与置信度想乘表示目标点的值。

? ? ? ? 处理过程我也并不是处理的很好,如下:

clear;clc%%清空工作区
load modis_20200104%%导入澳大利亚2020年1月4日高程数据
x=modis_20200104(:,1);%纬度
y=modis_20200104(:,2);%经度
h=modis_20200104(:,3).*modis_20200104(:,4)/100;%热度
xx=(y-min(y(:)))*111;%%经纬度转km
yy=(x-min(x(:)))*111;
X=int32(xx)+1;%%保留到整数
Y=int32(yy)+1;

? ? ? ? 关于经纬度的算法比较复杂,大家可以自行搜索相关资料,以下展示分布图的绘制方法:

%%绘制这张图的核心在于离散的点到一格一格的像素之间的转化,比如可能两个点非常接近,我们就需要将他们进行一个平均处理,使得最终图片的整体呈现效果较好即可

[lx,ly]=meshgrid(0:1:max(X(:)),0:1:max(Y(:)));%%生成网格用于装我们要绘制的图形的值
Z=zeros(max(Y(:))+1,max(X(:))+1);%%Z用于存储每个网格中的值
rep=zeros(max(Y(:))+1,max(X(:))+1);%%rep用于存储每个网格中点的个数,我们最后通过Z./rep得到每个网格中的热度平均值
for i=1:size(X,1)
    rep(Y(i),X(i))=rep(Y(i),X(i))+1;
    Z(Y(i),X(i))=Z(Y(i),X(i))+h(i);
end
rep=rep+eps;%%eps表示一个特别特别小的数,防止某个网格没有对应的点,0/0无法计算
Z=Z./rep;
[row,col]=find(Z>0);%%查找大于0的点(即有值的点),row存储行数组,col存储列数组,row(i)与col(i)一一对应
for i=1:size(row)
   high(i,1)=Z(row(i),col(i)) ;%%赋值准备绘图
end
figure(1);
surf(lx,ly,Z);%%绘制surf图像
axis equal%%让坐标系刻度均匀
shading interp%%光滑
title('Fire Distribution(km)')%%标题
hold on

????????但是这个代码仍有一点不足,在于其数据的点与点之间实在是相差太远(题目要分析维多利亚州东部,但是数据包含了整个澳大利亚),实际呈现效果如下(需要点一下上面那个立方体旋转的图标,然后右键图像,点击转至X-Y视图):

?????????很明显,只有右下角那一部分使我们需要的,那么我们就需要对我们的代码进行改进,以让其只显示我们制定的部分,改进部分代码比较简单,如下:

x_start=3380;%%表示x轴搜索的起点
x_len=350;%%表示x轴长度
y_start=400;%%表示y轴搜索的起点
y_len=250;%%表示y轴的长度
[lx,ly]=meshgrid(0:1:x_len,0:1:y_len);%%网格
Z=zeros(y_len+1,x_len+1);%%值
rep=zeros(y_len+1,x_len+1);%%点数
for i=1:size(X,1)%%对每个点,只要要求范围内的
    if(X(i)>x_start&X(i)<(x_start+x_len)&Y(i)>y_start&Y(i)<(y_start+y_len))
        rep(Y(i)-y_start,X(i)-x_start)=rep(Y(i)-y_start,X(i)-x_start)+1;
    	Z(Y(i)-y_start,X(i)-x_start)=Z(Y(i)-y_start,X(i)-x_start)+h(i);
    end
end
rep=rep+eps;%%加很小的数
Z=Z./rep;
[row,col]=find(Z>0);%%查找
for i=1:size(row)
   high(i,1)=Z(row(i),col(i)) ;%%赋值
end
figure(1);
surf(lx,ly,Z);%%绘图
axis equal%%坐标系同刻度
shading interp%%平滑
title('Fire Distribution(km)')
hold on

????????得到的图形如下(需要点一下上面那个立方体旋转的图标,然后右键图像,点击转至X-Y视图):

????????这就很有内味了。

? ? ? ? 对数据的处理仍有很大不足,这个例子只是为了让我们知道绘制此类图像的方法。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-27 11:02:06  更:2022-02-27 11:02:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:41:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码