MATLAB图论合集(一)基本操作基础

这篇具有很好参考价值的文章主要介绍了MATLAB图论合集(一)基本操作基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本帖总结一些经典的图论问题,通过MATLAB如何计算答案。近期在复习考研,以此来巩固一下相关知识——虽然考研肯定不能用MATLAB代码哈哈,不过在实际应用中解决问题还是很不错的,比C++易上手得多~

此外,本帖图论中非常重要的知识点——最小生成树。作为数据结构的理论知识,Prim算法和克鲁斯卡尔算法的思想此处博主不详细介绍,建议在阅读本帖前熟练掌握。

最后,本贴介绍最短路径的计算,实现方式为迪杰斯特拉算法;对于弗洛伊德算法,区别在于计算了所有结点之间的最短路径,考虑到MATLAB计算的便捷性,计算时只需要反复使用迪杰斯特拉即可,暂不介绍弗洛伊德的实现


(一)基本操作基础     

   图论中的图(Graph)是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事 物间具有这种系。

        一个图可以用数学语言描述为G(V(G),E(G))
        V(vertex)指 的是图的顶点集,E(edge)指的是图的边集。

1.有向图:弧是顶点的有序对,通过grapi(s,t)函数绘制。s和t分别是两个边两端的点集

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

   无向图:边是顶点的无序对,通过digrapi(s,t)函数绘制。

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

% 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图
s=[1 1 2 2 2 4 4 3 3 5];
t=[2 3 3 4 5 3 5 5 6 6];
%s和t为端点的集合
G1=graph(s,t);
plot(G1)
%绘制无向图
G2=digraph(s,t);
%绘制有向图
plot(G2)

 2.领接矩阵

无向图的领接矩阵必须是对称的,意义为两端点间相互建立联系;而有向图则仅需要从头到尾处建立连接即可(列向为起点,行向为终点)

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

 MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

如上图,对于一个相同的邻接矩阵,画出的有向图与无向图形状差距在于边数——对于对称的邻接矩阵,其画为有向图后两节点之间必定各有两条边。 

A1=[1,0,1,1,1,0;
    0,0,0,0,1,1;
    1,0,0,1,0,1;
    1,0,1,0,0,0;
    1,1,0,0,0,0;
    0,1,1,0,0,0;
    ];
G1=graph(A1);
%plot(G1)
G2=digraph(A1);
plot(G2)

3.增加与删除

  • addedge:添加新边
  • rmedge:删除边
  • addnode:添加节点
  • rmnode:删除指定节点
  • numegdes:边的数量
  • numnodes:节点的数量

此处演示一下增加节点的效果:

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

s3=[7,7,7,3,3,1,6];
t3=[3,1,6,1,6,6,6];
G3=graph(s3,t3);
G3=G3.addnode(3);
G3=G3.addedge(2,4);

plot(G3)

 MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

4.添加权重and命名结点

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

s=[1 1  2 3 3  5 6 7 5 2];
t=[2 4  7 4 6  8 7 8 6 8];
weights=[13 19 25 17 11 10  92 29 9 3 ];
names={'H' 'Y' '+' '&' 'J' 'S' 'L' '32'};
G=graph(s,t,weights,names);
plot(G,'EdgeLabel',weights)

(至于一些修改图片样式的操作,本贴暂不更新,后期抽空会出绘图专题~)

(二)计算最小生成树

对于无向带权图,在MATLAB中可以直接以邻接矩阵的方式创建出来,如下:

A=[0 20 0 0 15 0;
   20 0 20 60 25 0;
   0 20 0 30 18 0;
   0 60 30 0 35 10;
   15 25 18 35 0 15;
  0 0 0 10 15 0];
G=graph(A);

但是这种创建方式对于可视化并不是很友好——无法在图上显示每条边对应的权值,因此采用下面的方式创建:

s=[1 1 2 2 2 3 3 4 4 5];
t=[2 5 3 4 5 4 5 5 6 6];
weights=[20 15 20 60 25 30 18 35 10 15];
G=graph(s,t,weights);
plot(G,'EdgeLabel',weights);

创建出的带全无向图如下:

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

 首先我们先用普利姆算法手写一遍,得出的答案如下:

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

然后用MATLAB计算并可视化,用到内置函数minspantree: 

T=minspantree(G);
plot(T);

计算结果如下:

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

如图,和博主手算的略微有区别:其实是因为1——2与2——3两条边的权值一致,所以最后找到的结点2无论和结点1还是结点3连接都正确~ 

(三)Dijkstra算法计算最短路径

 MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构

迪杰斯特拉算法的思想,通俗的归纳来说就是:从当前结点出发,寻找一个未与当前简历连接——且路径最小的点作为下一个寻找到的地址。有关结点是否建立连接,需要一个如下的矩阵来辅助记录。

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构 若还未建立连接,则将前驱标记为-1,距离记录为无穷~

至于Distance内,存放的是起点到当前结点的最短距离,这一距离可能会不断更新,直到寻找到最短的路径为止~

实现的具体底代码:

  • 第一种:
[P,d] = shortestpath(G, 9, 4)

如上代码中,P表示的9与4节点之间最短路径经过的结点,而d保存的是最短路径值的总和~

  • 第二种:
D = distances(G);
D(1,2);
D(9,4);

如上代码中,D是一个存储了任意两结点之间最短路径的矩阵,通过索引访问的方式,即可求出任意两点的最短路径~

此外,如下是计算求出指定节点指定距离内部的全部结点的实现方式:

[nodeIDs,dist] = nearest(G, 2, 10); 

 注意,上述几个函数从2017a版本后才能全部使用

如下是创建图并计算图的具体实现方式:

s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 

set( gca, 'XTick', [], 'YTick', [] );

[P,d] = shortestpath(G, 9, 4);

myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2); 
highlight(myplot, P, 'EdgeColor', 'g') ; 

结果如下,绿色即为最短路径:

MATLAB图论合集(一)基本操作基础,Matlab与数学建模,matlab,图论,矩阵,数据结构文章来源地址https://www.toymoban.com/news/detail-644449.html

到了这里,关于MATLAB图论合集(一)基本操作基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • matlab:基本操作与矩阵输入

    学习素材:MATLAB教程_台大郭彦甫(14课)原视频补档 MATLAB教程_台大郭彦甫(14课)原视频补档_哔哩哔哩_bilibili (部分素材使用视频截图) 目录 一、基本运算 二、 三、\\\"format\\\"  四、符号 1.“;” 2.\\\":\\\"(colon operator) 五、关于矩阵 1.a=(3,:)用此方法来表示矩阵的某一行  

    2023年04月08日
    浏览(33)
  • 【MATLAB】 01 基本操作与数组输入

    认识 MATLAB 操作界面 可以通过 Layout 选择需要显示的窗口及布局 使用 MATLAB 编程有两种方法 命令行 (命令窗口) 脚本 ( .m 文件) 运算符 + , - , * , / , ^ 计算的结果 以 ans 显示 优先级 同一优先级从左到右 优先级为 Parenthesis ( () ) Power ( ^ ) Multiplication and division ( * , / ) Addition and sub

    2024年02月06日
    浏览(42)
  • MATLAB(一)基本操作与矩阵输入

    此篇文章是我在B站学习时所做的笔记,主要对MATLAB做了简单的介绍,代码部分为亲自动手演示过的,方便复习用。此篇文章仅供学习参考,禁止转载! 提示:以下是本篇文章正文内容,下面案例可供参考 Operators(操作员):+ - * / 结果由计算机显示为 Ans 优先组中从左到右的优

    2023年04月08日
    浏览(81)
  • Matlab —— 02 基本操作与矩阵输入

    1. help 功能:便于快速了解指令的使用 ex: 查询 pi 的简明介绍 Question 通过 matlab 计算出下列算式结果 Answer (1) (2) 或 (3) (4) 2. who 功能:便于快速了解变量类型 3. clear 功能:清除已经添加到工作区的变量 原先的工作区: 命令行操作: 当前的工作区: 4. format 功能:更全面

    2024年02月11日
    浏览(36)
  • 2.MATLAB篇——基本操作与矩阵输入

    Note: sqrt()为开根,exp(1)=e,pi=π,log()为In() + - * / ^ help () 变量的方式 查看变量类型who()、whos() : ans:answer i,j:complex number Inf:∞ eps: 很小的数 NaN:not a number pi:π iskeyword()查看 Note: 不能用来命名 消除workspace中的变量clear() format用法 Style 结

    2024年02月06日
    浏览(42)
  • Matlab:利用Matlab软件进行GUI界面设计实现图像的基本操作

    📌数模之路+Matlab 专栏正在持续更新中,案例的原理图解析、各种模块分析💖这里都有哦,同时也欢迎大家订阅专栏,获取更多详细信息哦✊✊✊ ✨个人主页:零小唬的博客主页 🥂欢迎大家 👍点赞 📨评论 🔔收藏 ✨作者简介:20级计算机专业学生一枚,来自宁夏,可能会

    2024年02月06日
    浏览(40)
  • 探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)

    欢迎阅读本篇博客,我们将深入探讨MATLAB语言的基础知识与实用技能,旨在帮助初学者、初中级MATLAB程序员以及在校大学生系统地掌握这门强大的科学计算与数据可视化工具。 一、MATLAB的基础知识 1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环 二、MATLAB的实用技能

    2024年03月12日
    浏览(59)
  • MATLAB 之 二维图形绘制的基本函数和辅助操作

    二维图形是将平面坐标上的数据点连接起来的平面图形。可以采用不同的坐标系,除直角坐标系外,还可以采用对数坐标、极坐标。数据点可以用向量或矩阵形式给出,类型可以是实型或复型。二维曲形的绘制无疑是其他绘图操作的基础。 在 MATLAB 中,基本的绘图函数是 pl

    2024年02月06日
    浏览(51)
  • Matlab基本操作和矩阵输入(郭彦甫视频学习笔记)

    who/whos         查看工作区当前变量 clear         清空工作区的所有变量(慎用) clear  valuable         清除变量valuable clc             清空命令行窗口 clear all         清除工作区所有变量 close all         关闭所有显示的图片 一行代码太长需要换行写可以在后面加 ... 

    2024年02月06日
    浏览(32)
  • 第5章:5.4.2 字符串数组的基本操作(MATLAB入门课程)

    ​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 在文本数据预处理阶段,我们通常需要对字符串数组进行基本的操作。我们将从字符串数组的引用开始,逐

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包