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 对象的函数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux开发实操(八):UART串口开发

串口可以说是非常好用的一个接口,它同USB、CAN、I2C、SPI等接口一样,为SOC/MCU构建了丰富的接口功能。那么在嵌入式linux中又是如何搭建和使用UART接口的呢? 一、Console接口即ttyS0 ttyS0通常做为u-boot(bootloader的一种,像是Windows的BIOS),它需要一个交互界面,一般…

pytest 编写规范

一、pytest 编写规范 1、介绍 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1、简单灵活,容易上手,文档丰富;2、支持参数化,可以细粒度地控制要测试的测试用例;3、能够…

问AI一个严肃的问题

chatgpt的问世再一次掀起了AI的浪潮,其实我一直在想,AI和人类的关系未来会怎样发展,我们未来会怎样和AI相处,AI真的会完全取代人类吗,带着这个问题,我问了下chatgpt,看一看它是怎么看待这个问题…

DNS WEB HTTP

DNS与域名 网络是基于 TCP/IP 协议进行通信和连接的。 每一台主机都有唯一的标识,用于区别在网络上成千上万个用户和计算机。即固定的IP地址(32位二进制数转换成为十进制数——点分十进制)。每一个与网络相连接的计算机和服务器都被指派一个…

应用程序运行报错:First section must be [net] or [network]:No such file or directory

应用程序报错环境: 在linux下,调用darknet训练的模型,报错:First section must be [net] or [network]:No such file or directory,并提示:"./src/utils.c:256: error: Assertion 0 failed." 如…

pytest自动化测试框架tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地。 在tep项目中,自动化测试用例都是放到tests目录下的,每个.py文件相互独立&…

TPAMI, 2023 | 用压缩隐逆向神经网络进行高精度稀疏雷达成像

CoIR: Compressive Implicit Radar | IEEE TPAMI, 2023 | 用压缩隐逆向神经网络进行高精度稀疏雷达成像 注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于Nature/Science及其子刊;MobiCom, Sigcom, MobiSy…

go的gin和gorm框架实现切换身份的接口

使用go的gin和gorm框架实现切换身份的接口,接收前端发送的JSON对象,查询数据库并更新,返回前端信息 接收前端发来的JSON对象,包含由openid和登陆状态组成的一个string和要切换的身份码int型 后端接收后判断要切换的身份是否低于该…

云原生网关API标准背景及发展现状

Gateway API是一个开源的API标准,源自Kubernetes SIG-NETWORK兴趣组。从出身角度讲,可谓根正苗红,自从开源以来备受关注,被寄予厚望。Gateway API旨在通过声明式、可扩展性和面向角色的接口来发展Kubernetes服务网络,并…

基于Selenium技术方案的爬虫入门实践

通过爬虫技术抓取网页,动态加载的数据或包含 JavaScript 的页面,需要使用一些特殊的技术和工具。以下是一些常用的技术方法: 使用浏览器模拟器:使用像 Selenium、PhantomJS 或其他类似工具可以模拟一个完整的浏览器环境&#xff0…

vue基础知识三:v-show和v-if有什么区别?使用场景分别是什么?

一、v-show与v-if的共同点 我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else)&#xff0c;都能控制元素在页面是否显示 在用法上也是相同的 <Model v-show"isShow" /> <Model v-if"isShow" />当表达式为true的时候&#…

9.3.2.2网络原理(传输层TCP)

TCP全部细节参考RFC标准文档 一.TCP特点: 有连接,可靠传输,面向字节流,全双工. 二.TCP数据报: 1.端口号是传输层的重要概念. 2.TCP的报头是变长的(UDP是固定的8字节),大小存在4位首部长度中,用4个bit位(0~15)表示长度单位是4字节.(TCP报头最大长度是60字节,前面20字节是固定…

[MAUI]在.NET MAUI中实现可拖拽排序列表

.NET MAUI 中提供了拖放(drag-drop)手势识别器&#xff0c;允许用户通过拖动手势来移动控件。在这篇文章中&#xff0c;我们将学习如何使用拖放手势识别器来实现可拖拽排序列表。在本例中&#xff0c;列表中显示不同大小的磁贴&#xff08;Tile&#xff09;并且可以拖拽排序。 …

【D3.js 01】

D3.js 01 说在前面1 概述2 配置Web环境3 HTML4 SVG5 DOM6 JS7 常用接口8 D3语法基础9 使用D3查询SVG10 使用D3设置SVG中属性11 修改整组属性12 使用D3添加与删除SVG元素13 数据读取 —— CSV数据14 D3.js的数值计算15 比例尺Scale - LinearScale - Band 16 引入坐标轴17 DATA-J…

13.3 目标检测和边界框

锚框的计算公式 假设原图的高为H,宽为W 详细公式推导 以同一个像素点为锚框&#xff0c;可以生成 (n个缩放 m个宽高比 -1 )个锚框 锚框的作用&#xff1a; 不用直接去预测真实框的四个坐标&#xff0c;而是&#xff1a; 1.先生成多个锚框。 2.预测每个锚框里是否含有要预测…

【11】Redis学习笔记 (微软windows版本)【Redis】

注意:官redis方不支持windows版本 只支持linux 此笔记是依托微软开发windows版本学习 一、前言 Redis简介&#xff1a; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据结构存储系统&#xff0c;它也被称为数据结构服务器。Redis以键值对&am…

使用Python统计字符内容的占比

说明&#xff1a;如果有自己动手做过字符动画&#xff0c;会知道字符动画的“灵动性”核心在于使用的字符集。 简单来说&#xff0c;动画转为字符动画&#xff0c;原理是将动画转为灰阶图&#xff0c;灰度范围是0~255&#xff0c;然后将对应灰度的像素点转为对应比值的字符。这…

轻松抽象JavaScript

上一期说了伪随机方法中有一个问题&#xff0c;那就是如何得到0.1这个值 理论上是可以的&#xff0c;但是实践缺有很大区别 大海捞针可信吗&#xff1f;可行吗&#xff1f; 当然可行&#xff0c;也可行&#xff0c;用一块超级大磁铁&#xff0c;磁力拉满&#xff0c;而且还具…

【论文阅读】基于深度学习的时序预测——Non-stationary Transformers

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长时序数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 论文三&#xff1a;2022 FEDformer&#xff1a;长序列数据预测 论文四&#xff1a;2022 Non-Stationary Transformers&#xff1a;非平…

web-js

<html><head><title>基本语法</title></head><body><script>// window.alert("js");// document.write("js");// console.log("js");// function add(a,b){// return ab;// }var result functio…