matlab使用教程(16)—图论中图的定义与修改

news2025/1/22 4:52:57

1.修改现有图的节点和边

        此示例演示如何使用 addedge rmedge addnode rmnode findedge findnode subgraph 函数访问和修改 graph digraph 对象中的节点和/或边。

1.1 添加节点

        创建一个包含四个节点和四条边的图。s t 中的对应元素用于指定每条图边的结束节点。
s = [1 1 1 2];
t = [2 3 4 3];
G = graph(s,t)
G =
graph with properties:
Edges: [4x1 table]
Nodes: [4x0 table]
        查看图的边列表。
G.Edges
ans=4×1 table
EndNodes
________
1 2
1 3
1 4
2 3
        使用 addnode 向图中添加五个节点。该命令将添加五个节点 ID 分别为 5 6 7 8 9 的不相连节点。
G = addnode(G,5)
G =
graph with properties:
Edges: [4x1 table]
Nodes: [9x0 table]

1.2 删除节点

        使用 rmnode 从图中删除节点 3、5 和 6。与其中一个已删除节点相连的所有边也会被删除。对图中剩余的六个节点重新进行编号,以反映新的节点数量。
G = rmnode(G,[3 5 6])
G =
graph with properties:
Edges: [2x1 table]
Nodes: [6x0 table]

1.3 添加边

        使用 addedge G 添加两条边。第一条边位于节点 1 和节点 5 之间,第二条边位于节点 2 和节点 5 之间。该命令将向 G.Edges 添加两个新行。
G = addedge(G,[1 2],[5 5])
G =
graph with properties:
Edges: [4x1 table]
Nodes: [6x0 table]

1.4 删除边

        使用 rmedge 删除节点 1 和节点 3 之间的边。该命令将从 G.Edges 中删除一个行。
G = rmedge(G,1,3)
G =
graph with properties:
Edges: [3x1 table]
Nodes: [6x0 table]

1.5 确定边索引

        确定节点 1 和 5 之间的边的边索引。边索引 ei G.Edges 中的行号。
ei = findedge(G,1,5)
ei = 2

1.6 确定节点索引

        在图中添加节点名称,然后确定节点 'd' 的节点索引。数值节点索引 ni G.Nodes 中的行号。使用其他图函数(例如 shortestpath )时,可以同时使用 ni 和节点名称 'd' 来表示节点。
G.Nodes.Name = { 'a' 'b' 'c' 'd' 'e' 'f' }';
ni = findnode(G, 'd' )
ni = 4

1.7 提取子图

        使用 subgraph 提取仅包含两个节点的图部分。
H = subgraph(G,[1 2])
H =
graph with properties:
Edges: [1x1 table]
Nodes: [2x1 table]
        查看子图的边列表。

H.Edges
ans=table
EndNodes
______________
{'a'} {'b'}

1.8 通过变量编辑器修改节点和边表格

        图对象的节点和边信息包含在 Nodes Edges 这两个属性中。这两个属性都是包含变量的表,用于说明图中的节点和边的特性。由于 Nodes Edges 都是表,因此您可以使用变量编辑器以交互方式查看或编辑这些表。您不能使用变量编辑器添加或删除节点或边,也不能编辑 Edges 表的 EndNodes 属性。变量编辑器适用于管理 Nodes Edges 表中的额外节点和边属性。

2.添加图节点名称、边权重和其他属性

        此示例演示如何向使用 graph digraph 创建的图中的节点和边添加属性。当您最初调用 graphdigraph 来创建图时,可以指定节点名称或边权重。但是,此示例演示了如何在创建图后向图添加属性。

2.1 创建图

        创建一个有向图。s t 中的对应元素用于定义图中每条边的源节点和目标节点。
s = [1 1 2 2 3];
t = [2 4 3 4 4];
G = digraph(s,t)
G =
digraph with properties:
Edges: [5x1 table]
Nodes: [4x0 table]

2.2 添加节点名称

        通过将变量 Name 添加到 G.Nodes 表中来向图中添加节点名称。 Name 变量必须指定为 N × 1 字符向量元胞数组或字符串数组,其中 N = numnodes(G) 。添加节点名称时请务必使用 Name 变量,因为该变量名称会被一些图函数进行特殊处理。
G.Nodes.Name = { 'First' 'Second' 'Third' 'Fourth' }';
        查看新的 Nodes 表。
G.Nodes
ans=4×1 table
Name
__________
{'First' }
{'Second'}
{'Third' }
{'Fourth'}
        使用表索引查看节点 1 和 4 的名称。
G.Nodes.Name([1 4])
ans = 2x1 cell
{'First' }
{'Fourth'}

2.3 添加边权重

        通过将变量 Weight 添加到 G.Edges 表中来向图添加边权重。 Weight 变量必须是 M×1 数值向量,其中 M = numedges(G) 。添加边权重时请务必使用 Weight 变量,因为该变量名称会被一些图函数进行特殊处理。
G.Edges.Weight = [10 20 30 40 50]';
        查看新的 Edges 表。
G.Edges
ans=5×2 table
EndNodes Weight
________________________ ______
{'First' } {'Second'} 10
{'First' } {'Fourth'} 20
{'Second'} {'Third' } 30
{'Second'} {'Fourth'} 40
{'Third' } {'Fourth'} 50
        使用表索引查看 G.Edges 的第一行和第三行。
G.Edges([1 3],:)
ans=2×2 table
EndNodes Weight
________________________ ______
{'First' } {'Second'} 10
{'Second'} {'Third' } 30

2.4 添加自定义属性

        原则上,您可以将任何变量添加到 G.Nodes G.Edges 中,来定义图节点或边的属性。添加自定义属性很有用,因为 subgraph reordernodes 之类的函数可以保留图属性。例如,可以向 G.Edges 添加名为 Power 的变量,来指示每条边是 'on' 还是 'off'G.Edges.Power = { 'on' 'on' 'on' 'off' 'off' }';
G.Edges
ans=5×3 table
EndNodes Weight Power
________________________ ______ _______
{'First' } {'Second'} 10 {'on' }
{'First' } {'Fourth'} 20 {'on' }
{'Second'} {'Third' } 30 {'on' }
{'Second'} {'Fourth'} 40 {'off'}
{'Third' } {'Fourth'} 50 {'off'}
        向 G.Nodes 添加名为 Size 的变量,来指示每个节点的实际大小。
G.Nodes.Size = [10 20 10 30]';
G.Nodes
ans=4×2 table
Name Size
__________ ____
{'First' } 10
{'Second'} 20
{'Third' } 10
{'Fourth'} 30

2.5 为图论图的节点和边添加标签

        绘制图时,您可以使用 G.Nodes G.Edges 中的变量为图节点和边添加标签。这种做法很方便,因为已经确保这些变量具有正确数量的元素。
        绘制图,并使用 G.Edges 中的 Power 变量为边添加标签。使用 G.Nodes 中的 Size 变量为节点添加标签。
p = plot(G, 'EdgeLabel' ,G.Edges.Power, 'NodeLabel' ,G.Nodes.Size)
p =
GraphPlot with properties:
NodeColor: [0 0.4470 0.7410]
MarkerSize: 4
Marker: 'o'
EdgeColor: [0 0.4470 0.7410]
LineWidth: 0.5000
LineStyle: '-'
NodeLabel: {'10' '20' '10' '30'}
EdgeLabel: {'on' 'on' 'on' 'off' 'off'}
XData: [2 1.5000 1 2]
YData: [4 3 2 1]
ZData: [0 0 0 0]
Show all properties

3.图的绘制和自定义

        此示例演示如何绘制图,然后自定义显示内容以向图节点和边添加标签或高亮显示。

3.1 绘图对象

        使用 plot 函数绘制 graph digraph 对象。默认情况下, plot 会检查图的大小和类型,以确定要使用的布局。生成的图窗窗口不包含轴刻度线。但是,如果使用 XData YData ZData 名称-值对组指定节点的 (x,y) 坐标,图窗将包含轴刻度线。
        节点数不超过 100 的图会自动包含节点标签。节点标签使用节点名称(如果可用);否则标签为数值节点索引。
        例如,使用巴基球邻接矩阵创建一个图,然后使用所有的默认选项绘制该图。如果您调用 plot 并指定输出参数,则此函数将返回 GraphPlot 对象的句柄。随后,您可以使用该对象调整绘图的属性。例如,可以更改边的颜色或样式、节点的大小和颜色等。
G = graph(bucky);
p = plot(G)

p =
GraphPlot with properties:
NodeColor: [0 0.4470 0.7410]
MarkerSize: 4
Marker: 'o'
EdgeColor: [0 0.4470 0.7410]
LineWidth: 0.5000
LineStyle: '-'
NodeLabel: {1x60 cell}
EdgeLabel: {}
XData: [0.1033 1.3374 2.2460 1.3509 0.0019 -1.0591 -2.2901 -2.8275 -1.9881 -0.8836 1.5240 0.4128 0.6749 1.9866 2.5705 3.3263 3.5310 3.9022 3.8191 3.5570 1.5481 2.6091 1.7355 0.4849 0.2159 -1.3293 -1.2235 -2.3934 -3.3302 -2.4370 2.4601 ... ]
YData: [-1.8039 -1.2709 -2.0484 -3.0776 -2.9916 -0.9642 -1.2170 0.0739 1.0849 0.3856 0.1564 0.9579 2.2450 2.1623 0.8879 -1.2600 0.0757 0.8580 -0.4702 -1.8545 -3.7775 -2.9634 -2.4820 -3.0334 -3.9854 -3.2572 -3.8936 -3.1331 -2.2357 -2.4880 ... ]
ZData: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Show all properties
        获得 GraphPlot 对象的句柄后,便可以使用点索引访问或更改属性值。有关您可以调整的属性的完整列表,请参阅 GraphPlot 属性。将 NodeColor 的值更改为 'red'
p.NodeColor = 'red' ;

        确定边的线宽。
p.LineWidth
ans = 0.5000

3.2 创建并绘制图

        创建并绘制一个表示 L 形膜的图,L 形膜是基于一侧有 12 个节点的方形网格构建的。使用 plot 指定输出参数以返回 GraphPlot 对象的句柄。
n = 12;
A = delsq(numgrid( 'L' ,n));
G = graph(A, 'omitselfloops' )
G =
graph with properties:
Edges: [130x2 table]
Nodes: [75x0 table]
p = plot(G)
p =
GraphPlot with properties:
NodeColor: [0 0.4470 0.7410]
MarkerSize: 4
Marker: 'o'
EdgeColor: [0 0.4470 0.7410]
LineWidth: 0.5000
LineStyle: '-'
NodeLabel: {1x75 cell}
EdgeLabel: {}
XData: [-2.5225 -2.1251 -1.6498 -1.1759 -0.7827 -2.5017 -2.0929 -1.6027 -1.1131 -0.7069 -2.4678 -2.0495 -1.5430 -1.0351 -0.6142 -2.4152 -1.9850 -1.4576 -0.9223 -0.4717 -2.3401 -1.8927 -1.3355 -0.7509 -0.2292 -2.2479 -1.7828 -1.1871 -0.5239 ... ]
YData: [-3.5040 -3.5417 -3.5684 -3.5799 -3.5791 -3.0286 -3.0574 -3.0811 -3.0940 -3.0997 -2.4191 -2.4414 -2.4623 -2.4757 -2.4811 -1.7384 -1.7570 -1.7762 -1.7860 -1.7781 -1.0225 -1.0384 -1.0553 -1.0568 -1.0144 -0.2977 -0.3097 -0.3229 -0.3152 ... ]
ZData: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Show all properties

3.3 更改图节点的布局

        使用 layout 函数更改绘图中的图节点的布局。不同的布局选项会自动计算绘图的节点坐标。或者,可以使用 GraphPlot 对象的 XData YData ZData 属性来指定您自己的节点坐标。不使用默认的二维布局方法,而是使用 layout 来指定 'force3' 布局(三维力导向图布局)。
layout(p, 'force3' )
view(3)

3.4 按比例对节点着色

        根据图节点的出入度为它们着色。在该图中,所有内部节点都具有最大度数 4,沿图边的节点的度数为 3,角节点具有最小度数 2。将该节点着色数据存储为 G.Nodes 中的变量 NodeColors
G.Nodes.NodeColors = degree(G);
p.NodeCData = G.Nodes.NodeColors;
colorbar

3.5 按权重列出的边线宽度

        向图边添加一些随机整数权重,然后绘制这些边,使它们的线宽与权重成比例。由于约大于 7 的边线宽度开始变得很复杂,因此缩放线宽,使权重最大的边的线宽为 7。将该边宽数据存储为 G.Edges 中的变量LWidths
G.Edges.Weight = randi([10 250],130,1);
G.Edges.LWidths = 7*G.Edges.Weight/max(G.Edges.Weight);
p.LineWidth = G.Edges.LWidths;

3.6 提取子图

        提取 G 的右上角并将其作为子图绘制,以更便于读取图上的详细信息。新图 H G 继承 NodeColors LWidths 变量,因此最直接的方式就是重新创建之前的绘图自定义项。但是,系统会对 H 中的节点重新进行编号,以将图中的新节点编号考虑在内。
H = subgraph(G,[1:31 36:41]);
p1 = plot(H, 'NodeCData' ,H.Nodes.NodeColors, 'LineWidth' ,H.Edges.LWidths);
colorbar

3.7 为节点和边添加标签

        使用 labeledge 对宽度大于 6 的边添加标签 'Large' labelnode 函数以相似的方式为节点添加标签。
labeledge(p1,find(H.Edges.LWidths > 6), 'Large' )

3.8 突出显示最短路径

        查找子图 H 中节点 11 与节点 37 之间的最短路径。以红色高亮显示沿此路径的边,并增大路径的结束节点的大小。
path = shortestpath(H,11,37)
path = 1×10
11 12 17 18 19 24 25 30 36 37
highlight(p1,[11 37])
highlight(p1,path, 'EdgeColor' , 'r' )
        删除节点标签和颜色栏,并使所有节点都变成黑色。
p1.NodeLabel = {};
colorbar off
p1.NodeColor = 'black' ;

        查找忽略边权重的其他最短路径。以绿色突出显示此路径。
path2 = shortestpath(H,11,37, 'Method' , 'unweighted' )
path2 = 1×10
11 12 13 14 15 20 25 30 31 37
highlight(p1,path2, 'EdgeColor' , 'g' )

3.9 绘制大图

        创建包含数十万个甚至数百万个节点和/或边的图是很常见的。为此,plot 处理大图会略有不同,以保持可读性和性能。处理节点超过 100 个的图时, plot 函数会进行以下调整:
1 默认的图布局方法始终为 'subspace'
2 不会再自动为这些节点添加标签。
3 MarkerSize 属性设置为 2 。(较小的图的标记大小为 4 )。
4 有向图的 ArrowSize 属性设置为 4 。(较小的有向图使用的箭头大小为 7 )。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】零成本将小米净化器改造为无叶风扇

某宝某多上,就这么点破塑料,就要买79?!! 我这枚韭菜可不上当。咱自己做一个! 真香~

BBS项目day02、注册、登录(登录之随机验证码)、修改密码、退出登录、密码加密加盐

一、注册 1.注册之前端页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title><!--动态引入文件-->{% load static %}<script src"{% static js/jquery.min.js %…

jquery技术学习2

移动节点 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>移动节点</title><script type"text/javascript" src"../script/jquery-3.6.0.min.js"></script>&l…

【Spring】深入理解 Spring 事务及其传播机制

文章目录 一、Spring 事务是什么二、Spring 中事务的实现方法2.1 Spring 编程式事务&#xff08;手动&#xff09;2.1.1 编程式事务的使用演示2.1.2 编程式事务存在的问题 2.2 Spring 声明式事务&#xff08;自动&#xff09;2.2.1 Transactional 作用范围2.2.2 Transactional …

化繁为简,使用Hibernate Validator实现参数校验

前言 在之前的悦享校园的开发中使用了SSM框架&#xff0c;由于当时并没有使用参数参数校验工具&#xff0c;方法的入参判断使用了大量的if else语句&#xff0c;代码十分臃肿&#xff0c;因此最近在重构代码时&#xff0c;将框架改为SpringBoot后&#xff0c;引入了Hibernate V…

HCIP MPLS实验

MPLS实验 拓扑MPLS VPN配置PE与PE间建立MP-BPG邻居关系R7访问R2,R3,R4环回 拓扑 MPLS VPN配置 首先可以用OSPF协议将R2,R3,R4跑通&#xff0c;然后配置MPLS [R2]mpls lsr-id 2.2.2.2 定义MPLS的router-id&#xff0c;要为本地设备的真实ip地址&#xff0c;且邻居可达&#…

机器学习算法之-逻辑回归(2)

为什么需要逻辑回归 拟合效果太好 特征与标签之间的线性关系极强的数据&#xff0c;比如金融领域中的 信用卡欺诈&#xff0c;评分卡制作&#xff0c;电商中的营销预测等等相关的数据&#xff0c;都是逻辑回归的强项。虽然现在有了梯度提升树GDBT&#xff0c;比逻辑回归效果更…

【学习FreeRTOS】第8章——FreeRTOS列表和列表项

1.列表和列表项的简介 列表是 FreeRTOS 中的一个数据结构&#xff0c;概念上和链表有点类似&#xff0c;列表被用来跟踪 FreeRTOS中的任务。列表项就是存放在列表中的项目。 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表列表的…

【大数据之Kafka】三、Kafka生产者之消息发送流程及同步异步发送API

将外部传送给过来的数据发送到kafka集群。 1 发送原理 &#xff08;1&#xff09;创建main()线程&#xff0c;创建producer对象&#xff0c;调用send方法&#xff0c;经过拦截器&#xff08;可选&#xff09;、序列化器、分区器。 &#xff08;2&#xff09;分区器将数据发送…

java面试题(16):Mysql一致性视图是啥时候建立的

1 演示错误案例 先给大家来一个错误演示。 我们打开两个会话窗口&#xff0c;默认情况下隔离级别是可重复读&#xff0c;我们来看下&#xff1a; 首先在 A 会话中查看当前 user 表&#xff0c;查看完成后开启事务&#xff1a; 可以看到id3的数据sex是男。 接下来在 B 会话中…

场景入门12----关卡切换和流送

在游戏时往往需要切换关卡&#xff0c;有两种方法&#xff0c;关卡切换和推送。关卡切换的方法是进入了一个新的地图&#xff0c;这时人物的值都复原了&#xff0c;一般都是在一个地图上推送关卡。 关卡切换 首先&#xff0c;文件新建一个新关卡&#xff0c;命名。找到之前制…

地址解析协议-ARP

ARP协议 无论网络层使用何种协议&#xff0c;在实际网络的链路上传输数据帧时&#xff0c;最终必须使用硬件地址 地址解析协议&#xff08;Address Resolution Protocol&#xff0c;ARP&#xff09;&#xff1a;完成IP地址到MAC地址的映射&#xff0c;每个主机都有一个ARP高速缓…

C语言刷题训练DAY.4

1.计算体重指数 解题思路&#xff1a; 这里我们只需要按照他的要求写出公式。 注意&#xff1a;身高要换算成米&#xff0c;打印的结构是个浮点数&#xff0c;打印的格式要相对应 解题代码&#xff1a; #include<stdio.h> int main() {int weight 0;int height 0;…

Python自动化小技巧18——自动化资产月报(word设置字体表格样式,查找替换文字)

案例背景 每月都要写各种月报&#xff0c;经营管理月报&#xff0c;资产月报.....这些报告文字目标都是高度相似的&#xff0c;只是需要替换为每个月的实际数据就行&#xff0c;如下&#xff1a; (打码是怕信息泄露.....) 可以看到&#xff0c;这个报告的都是高度模板化&…

浏览器 - 事件循环机制详解

目录 1&#xff0c;浏览器进程模型进程线程浏览器的进程和线程1&#xff0c;浏览器进程2&#xff0c;网络进程3&#xff0c;渲染进程 2&#xff0c;渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3&#xff0c;常见面试题1&#xff0c;如何理解 js 的异步2&#x…

时序预测 | MATLAB实现基于KNN K近邻的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于KNN K近邻的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于KNN K近邻的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 基于KNN K近邻的时间序列预测-递归预测未来(多指标评价) …

数据集成与流动优化:解锁企业数据的无限潜力

在当今数字化时代&#xff0c;企业拥有海量数据&#xff0c;这些数据散落在不同部门、系统和平台之间&#xff0c;形成了所谓的“数据孤岛”。要想实现数据的最大化价值&#xff0c;就必须解决数据集成与流动的挑战。本文将深入探讨数据集成与流动优化的重要性&#xff0c;以及…

833-字符串中查找与替换

题目描述&#xff1a; 你会得到一个字符串 s (索引从 0 开始)&#xff0c;你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出&#xff1a;indices, sources, targets。 要完成第 i 个替换操作: 检查 子字符串 sources[i] 是否出现在 原字符串 s 的索…

POSTGRESQL 关于安装中自动启动的问题 详解

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

使用SpringBoot + Thymeleaf 完成简单的用户登录

&#x1f600;前言 本篇博文是关于Thymeleaf 的综合案例&#xff0c; 使用SpringBoot Thymeleaf 完成简单的用户登录-列表功能&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨…