matlab使用教程(15)—图论基础

1.有向图和无向图

1.1什么是图?

        图是表示各种关系的节点和边的集合:
        • 节点 是与对象对应的顶点。
        • 是对象之间的连接。
        • 图的边有时会有权重 ,表示节点之间的每个连接的强度(或一些其他属性)。
        这些定义是概括性的,因为节点和边在图中的确切含义取决于具体的应用情形。例如,您可以使用图为社交网站中的朋友关系建模。图节点表示人,边表示朋友关系。图与物理对象和各种情况的自然对应关系意味着,您可以使用图对各种系统进行建模。例如:
        • 网页链接 - 图节点代表网页,边表示网页之间的超链接。
        • 机场 - 图节点代表机场,边表示机场之间的航班。在 MATLAB 中,graph digraph 函数用于构建表示无向图和有向图的对象。
        • 无向图的边没有方向。这些边指示双向关系,因为每条边都可以在两个方向上穿过。下图显示了一个包含三个节点和三条边的简单无向图。
        • 有向图的边带有方向。这些边指示单向关系,因为每条边只能在单个方向上穿过。下图显示了一个包含三个节点和两条边的简单有向图。
        边在图中的确切位置、长度或方向通常没有含义。换言之,只要基础结构不变,就可以通过重新排列节点和/或使边扭曲,以多种不同的方式显示同一个图。

1.2 自环和多重图

        使用 graph digraph 创建的图可以有一个或多个自环,自环是指一条边的两端为同一个节点。此外,图可以具有多条有相同源节点和目标节点的边,这样的图称为多重图。多重图可能包含自环,也可能不包含。
        对于 MATLAB 中的图算法函数来说,如果图中包含的节点只有一个自环,则不属于多重图。但是,如果图中包含的节点具有多个自环,则属于多重图。
        例如,下图显示了具有多个自环的无向多重图。节点 A 有三个自环,节点 C 有一个。该图包含以下三个条件,任何一个条件都满足多重图的条件。
        • 节点 A 有三个自环。
        • 节点 A 和 B 之间有五条边。
        • 节点 A 和 C 之间有两条边。
        要确定给定的图是否为多重图,请使用 ismultigraph 函数。

2.创建图

        创建图的主要方式包括使用邻接矩阵或边列表。

2.1 邻接矩阵

        有一种表示图中信息的方法是使用方形邻接矩阵。邻接矩阵中的非零项表示两个节点之间的边,条目值表示边的权重。邻接矩阵的对角线元素通常为零,但非零对角线元素表示自环或通过边与其自身相连的节点。
        • 当您使用 graph 创建无向图时,邻接矩阵必须对称。但在实践中,为避免重复,这些矩阵通常为三角形。要仅使用邻接矩阵的上三角或下三角构建无向图,请使用 graph(A,'upper')
graph(A,'lower')
        • 当您使用 digraph 创建有向图时,邻接矩阵不需要对称。
        • 对于大型图,邻接矩阵包含许多零并且通常为稀疏矩阵。
        • 您不能从邻接矩阵创建多重图。
        例如,考虑创建如下无向图。

 

        可以通过下面的邻接矩阵表示该图:
 
        要在 MATLAB 中构建该图,请输入:
A = [0 1 2; 1 0 3; 2 3 0];
node_names = { 'A' , 'B' , 'C' };
G = graph(A,node_names)
G =
graph with properties:
Edges: [3×2 table]
Nodes: [3×1 table]
        您可以使用邻接矩阵通过 graph digraph 函数来创建图,也可以使用 adjacency 函数求预先存在的图的加权或未加权的稀疏邻接矩阵。

2.2 边列表

        表示图信息的另一种方法是列出所有边。例如,考虑创建与上面相同的无向图。现在用边列表来表示该图
        从边列表中很容易得出以下结论:该图包含三个唯一节点 A BC,这三个节点通过三条列出的边相连。如果该图有断开的节点,边列表中将不会列出这些节点,您需要单独指定它们。 在 MATLAB 中,边列表按列划分为源节点和目标节点。对于有向图,边的方向(从源到目标)很重要;但对于无向图,源节点和目标节点是可以互换的。使用边列表构建该图的一种方法是,对源节点、目标节点和边权重使用单独的输入:
source_nodes = { 'A' , 'A' , 'B' };
target_nodes = { 'B' , 'C' , 'C' };
edge_weights = [1 2 3];
G = graph(source_nodes, target_nodes, edge_weights);
        graph digraph 都允许使用边列表构造简单图或多重图。构建图 G 后,可以使用命令 G.Edges 查看边(及其属性)。这些边在 G.Edges 中的顺序首先按源节点(第一列)排列,其次按目标节点(第二列)排列。对于无向图,索引较小的节点列为源节点,索引较大的节点列为目标节点。由于 graph digraph 的底层实现取决于稀疏矩阵,因此许多相同的索引创建成本均适用。使用前述方法之一基于三元对组 (source,target,weight) 一次性构建图比先创建空图再以迭代方式添加更多节点和边要快。为获得最佳性能,请尽量减少对 graphdigraphaddedgeaddnodermedgermnode 的调用次数。

3.图节点 ID

        默认情况下,系统会对使用 graph digraph 创建的图的所有节点进行编号。因此,您始终可以通过数值节点索引来引用它们。如果图具有节点名称(即 G.Nodes 包含变量 Name),则您还可以使用节点名称来表示图中的节点。因此,可以通过节点索引或节点名称来表示图中的已命名节点。例如,可以调用节点 1'A'。术语节点 ID 同时包含节点标识的两个方面的内容。节点 ID 既表示节点索引,也表示节点名称。为方便起见,MATLAB 会记住您在调用大多数图函数时使用的节点 ID 的类型。因此,如果您使用节点索引表示图中的节点,则大多数图函数返回的数值答案也会通过节点索引来表示这些节点。
A = [0 1 1 0; 1 0 1 0; 1 1 0 1; 0 0 1 0];
G = graph(A,{ 'a' , 'b' , 'c' , 'd' });
p = shortestpath(G,1,4)
p =
1 3 4
        但是,如果使用节点名称来表示节点,则大多数图函数返回的答案也会通过节点名称来表示这些节点(包含在字符向量元胞数组或字符串数组中)。
p1 = shortestpath(G, 'a' , 'd' )
p1 =
1×3 cell array
{'a'} {'c'} {'d'}
        使用 findnode 查找给定的节点名称的数值节点 ID。反过来,对于给定的数值节点 ID,请创建指向G.Nodes.Name 的索引以确定对应的节点名称。

4.修改或查询现有图

        构造 graph digraph 对象后,您可以使用各种函数来修改图结构或确定图有多少个节点或多少条边。下表列出了一些可用于修改或查询 graph digraph 对象的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/74179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tree相关

1.树相关题目 1.1 二叉树的中序遍历(简单):递归 题目:使用中序遍历二叉树 思想:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历&#xff0…

​LeetCode解法汇总1572. 矩阵对角线元素的和

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你一个正…

Camx--概述

该部分代码主要位于 vendor/qcom/proprietary/ 目录下: 其中 camx 代表了通用功能性接口的代码实现集合(CamX),chi-cdk代表了可定制化需求的代码实现集合(CHI),从图中可以看出Camx部分对上作为H…

Redis_缓存2_缓存删除和淘汰策略

14.5 缓存数据的删除和替换 14.5.1 过期数据 可以使用ttl查看key的状态。已过期的数据,redis并未马上删除。优先去执行读写数据操作,删除操作延后执行。 14.5.2 删除策略 redis中每一个value对应一个内存地址,在expires,一个内…

安全第二次

一&#xff0c;iframe <iframe>标签用于在网页里面嵌入其他网页。 1&#xff0c;sandbox属性 如果嵌入的网页是其他网站的页面&#xff0c;因不了解对方会执行什么操作&#xff0c;因此就存在安全风险。为了限制<iframe>的风险&#xff0c;HTML 提供了sandb…

Django路由Router

文章目录 一、路由router路由匹配命名空间反向解析 二、实践创建用户模型Model添加子路由 - 创建用户首页页面跳转 - 使用反向解析和命名空间1. 不使用命名空间的效果2. 使用命名空间的效果 用户详情页面跳转 - 路由传参路由传递多个参数re_path 以前写法,了解即可重定向Redire…

二叉树题目:二叉树的直径

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉树的直径 出处&#xff1a;543. 二叉树的直径 难度 3 级 题目描述 要求 给定二叉树的根结点 root \texttt{root} root&#xff0c;返回其直径…

java练习3.快速查找

题目: 数组 arr[6,1,3,7,9,8,5,4,2],用快速排序进行升序排序. import java.util.Random;public class recursionDemo {public static void main(String[] args) {/*快速排序:* 第一轮:以0索引为基准数,确定基准数在数组正确的位置,* 比基准数小的放到左边,比基准数大的放在右边…

FPGA应用学习-----FIFO双口ram解决时钟域+asic样机的时钟选通

60m写入异步ram&#xff0c;再用100M从ram中读出 写地址转换为格雷码后&#xff0c;打两拍和读地址判断是否空产生。相反读地址来判断是否满产生。 分割同步模块 asic时钟的门控时钟&#xff0c;fpga是不推荐采用门控时钟的&#xff0c;有很多方法移除fpga的时钟选通。 如果是a…

算法通关村第七关——递归和迭代实现二叉树前中后序遍历

1.递归 1.1 熟悉递归 所有的递归有两个基本特征&#xff1a; 执行时范围不断缩小&#xff0c;这样才能触底反弹。终止判断在调用递归的前面。 写递归的步骤&#xff1a; 从小到大递推。分情况讨论&#xff0c;明确结束条件。组合出完整方法。想验证就从大到小画图推演。 …

中级课程——XSS

文章目录 介绍挖掘思路分类反射型存储型dom类型 介绍 挖掘思路 注入点&#xff1a;各种输入框 测试代码&#xff08;poc&#xff09;&#xff1a;js语句 分类 反射型 存储型 dom类型

Java并发编程(六)线程池[Executor体系]

概述 在处理大量任务时,重复利用线程可以提高程序执行效率,因此线程池应运而生。 它是一种重用线程的机制,可以有效降低内存资源消耗提高响应速度。当任务到达时&#xff0c;任务可以不需要的等到线程创建就能立即执行线程池可以帮助我们更好地管理线程的生命周期和资源使用,…

机器学习 | Python实现KNN(K近邻)模型实践

机器学习 | Python实现KNN(K近邻)模型实践 目录 机器学习 | Python实现KNN(K近邻)模型实践基本介绍模型原理源码设计学习小结参考资料基本介绍 一句话就可以概括出KNN(K最近邻算法)的算法原理:综合k个“邻居”的标签值作为新样本的预测值。更具体来讲KNN分类过程,给定一个训…

Android APK体积优化(瘦身)

1、基础知识&#xff1a; 1.1 apk结构 lib &#xff1a;存放so文件&#xff0c;对应不同的cpu架构 res &#xff1a;资源文件&#xff0c;layout、drawable等&#xff0c;经过aapt编译 assets &#xff1a;资源文件&#xff0c;不经过aapt编译 classes.dex &#xff1a;dx编译…

基于HTML+CSS+Echarts大屏数据可视化集合共99套

基于HTMLCSSEcharts大屏数据可视化集合共99套 一、介绍二、展示1.大数据展示系统2.物流订单系统3.物流信息系统4.办税渠道监控平台5.车辆综合管控平台 三、其他系统实现四、获取源码 一、介绍 基于HTML/CSS/Echarts的会议展览、业务监控、风险预警、数据分析展示等多种展示需求…

菜单和内容滚动的联动原理及代码

之前写代码有个需求&#xff1a;左侧是一个菜单&#xff0c;右边是内容&#xff0c;点击左侧菜单右边内容滚动到对应位置&#xff0c;右边内容滚动到某位置时&#xff0c;左侧菜单也会选中对应的菜单项。UI如下&#xff1a;这是大多网站的移动端都会有的需求。 解决方案一&…

Spring Boot业务代码中使用@Transactional事务失效踩坑点总结

1.概述 接着之前我们对Spring AOP以及基于AOP实现事务控制的上文&#xff0c;今天我们来看看平时在项目业务开发中使用声明式事务Transactional的失效场景&#xff0c;并分析其失效原因&#xff0c;从而帮助开发人员尽量避免踩坑。 我们知道 Spring 声明式事务功能提供了极其…

python3装饰器理解与实战

前言 装饰器本质上是一个Python函数&#xff0c;它可以让其他函数在不需要做任务代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景&#xff0c;比如&#xff1a;插入日志、性能测试、事务处理、缓存、权限校验等场景。装…

R语言生存分析(机器学习)(2)——Enet(弹性网络)

弹性网络&#xff08;Elastic Net&#xff09;:是一种用于回归分析的统计方法&#xff0c;它是岭回归&#xff08;Ridge Regression&#xff09;和lasso回归&#xff08;Lasso Regression&#xff09;的结合&#xff0c;旨在克服它们各自的一些限制。弹性网络能够同时考虑L1正则…

YARN框架和其工作原理流程介绍

目录 一、YARN简介 二、YARN的由来 三、YARN的基本设计思想 四、YARN 的基本架构 4.1 基本架构图 4.2 基本组件介绍 4.2.1 ResourceManager 4.2.1.1 任务调度器(Resource Scheduler) 4.2.1.2 应用程序管理器&#xff08;Applications Manager&#xff09; 4.2.1.3 其他…