MATLAB 图论
BrotherCall · · 个人记录
生成每个顶点 v_i 的形式
s = cellstr(strcat('v',int2str([1:x]'])));
邻接矩阵构建流程
构建全零矩阵
a = zeros(x) % x 代表点数
构建矩阵
无向图:上三角矩阵。
赋值语法:
a(x , y) = z;
其中可用
a(x , [y1:y2]) = z;
给
构造图
无向图:
G = graph(a , s , 'Upper');
s 为顶点名字符串集合,'Upper' 指上三角矩阵。
有向图:
G = digraph(a , s);
plot 函数的用法
h = plot(G); % 绘制图 G
h = plot(G, 'Parameter1', Value1, 'Parameter2', Value2, ...); % 自定义参数
(1) 节点样式(Node Appearance)
| 参数 | 说明 | 示例值 |
|---|---|---|
'NodeColor' |
节点颜色 | 'r' (红), [0, 0.5, 0] (深绿), '#FF8800' (十六进制) |
'Marker' |
节点形状 | 'o' (圆圈, 默认), 's' (方形), '^' (三角形) |
'MarkerSize' |
节点大小 | 6 (默认), 10 |
'NodeLabel' |
节点标签 | G.Nodes.Name (节点名称), {} (隐藏标签) |
'NodeFontSize' |
标签字体大小 | 12 |
'NodeFontWeight' |
标签字体粗细 | 'normal', 'bold' |
示例:
plot(G, 'NodeColor', 'k', 'Marker', 's', 'MarkerSize', 8);
(2) 边样式(Edge Appearance)
| 参数 | 说明 | 示例值 |
|---|---|---|
'EdgeColor' |
边颜色 | 'b' (蓝), 'none' (透明) |
'LineWidth' |
边宽度 | 0.5 (默认), 2 |
'LineStyle' |
边线型 | '-' (实线), '--' (虚线), ':' (点线) |
'ArrowSize' |
有向图箭头大小 | 7 (默认), 15 |
'EdgeLabel' |
边标签(如权重) | G.Edges.Weight |
'EdgeFontSize' |
边标签字体大小 | 10 |
示例:
plot(G, 'EdgeColor', 'r', 'LineWidth', 1.5, 'ArrowSize', 12);
(3) 图的布局(Layout)
| 参数 | 说明 | 示例值 |
|---|---|---|
'Layout' |
节点排列方式 | 'auto' (默认), 'force', 'circle', 'layered' |
'XData', 'YData' |
自定义节点坐标 | 向量(长度 = 节点数) |
'ZData' |
3D 图的 z 坐标 | 需配合 'Layout', 'force3' |
布局类型说明:
'auto':MATLAB 自动选择(通常类似'force')。'force':力导向布局(适合大多数图)。'circle':节点均匀分布在圆周上。'layered':有向图的分层布局(DAG 适用)。'subspace':基于特征向量的布局。'force3':3D 力导向布局(需'ZData')。
示例:
plot(G, 'Layout', 'circle'); % 环形布局
plot(DG, 'Layout', 'layered'); % 有向图分层布局
(4) 标签和标题
| 参数 | 说明 | 示例值 |
|---|---|---|
'NodeLabel' |
节点标签 | G.Nodes.Name, {} (隐藏) |
'EdgeLabel' |
边标签 | G.Edges.Weight |
'Interpreter' |
标签解释器 | 'none' (默认), 'latex' (支持 LaTeX) |
示例:
plot(G, 'NodeLabel', {}, 'EdgeLabel', G.Edges.Weight); % 只显示边权重
(5) 高亮特定节点或边
通过 highlight 函数动态修改样式:
h = plot(G);
highlight(h, [1, 2], 'NodeColor', 'r'); % 高亮节点 1 和 2
highlight(h, [1, 2], [2, 3], 'EdgeColor', 'g'); % 高亮边 (1,2) 和 (2,3)
figure 函数作用:
开一个新窗口,让新图不和原来的叠在一起。
边权展示形式:
'EdgeLabel',G.Edges.Weight
单源最短路
P = shortestpath(G,s,t)
[P,d] = shortestpath(G,s,t)
[P,d,edgepath] = shortestpath(G,s,t)
G:输入图,可以是 graph(无向图)或 digraph(有向图)对象
s:起始节点
t:目标节点
P:从节点s到节点t的最短路径节点序列
d:最短路径的总长度/权重
edgepath:最短路径中的边的索引序列
可选参数
[P,d] = shortestpath(G,s,t,'Method',algorithm)
'unweighted':广度优先搜索,适用于无权图
'positive':Dijkstra算法,适用于所有边权重为正的图
'mixed':Bellman-Ford算法,适用于含负权边但无负权环的图