在 MATLAB 中从有向图中提取分支

Extract branches from digraph in MATLAB

我正在寻找一种在 MATLAB 中提取有向图分支的方法。准确地说,如果我有一个类似于以下的网络(my_digraph):

当我输入 my_digraph.plot 时,我收到了这个:

我现在可以通过查看图片手动记下分支,例如[1, 2][1, 3][1, 6, 7] 等。但是,在更大的网络中,这不再是可能的。我可以使用哪个函数从图片中提取此信息,以便它给我类似包含这些向量的数组?

注意:我知道上面的图片不是有向图,因为它们没有方向。不过,他们还是说明了原理。

据我了解你的问题,你想要从节点 1 到所有 "end-nodes"(1 级节点)的所有最短路径。

让我们先定义图表:

edges = [
  [1,2],
  [1,3],
  [1,4],
  [1,5],
  [1,6],
  [6,7],
  [6,8],
  [6,9],
  [6,10],
  [6,11]]

G = graph(edges(:,1),edges(:,2))

现在,让我们定义开始节点 (1) 并找到所有结束节点,我们将其作为所有 1 度节点(即仅通过一条边连接的节点)的索引获得

node_start = 1
nodes_degree = degree(G)
nodes_end = find(nodes_degree == 1)

现在我们遍历所有结束节点,并为每个节点找到从起始节点到相应结束节点的最短路径。我们将生成的节点数组沿短路路径存储在 paths 单元格中。

paths = {}
for path_idx = 1:numel(nodes_end)
  node_end = nodes_end(path_idx)
  path = shortestpath(G,node_start,node_end)
  paths{path_idx} = path
end

我们的 paths 单元现在包含所有最短路径。例如:

disp(paths{5})

>>>  1   6   7

或显示全部

cellfun(@(path) disp(path), paths) 

>>>  1     2

     1     3

     1     4

     1     5

     1     6     7

     1     6     8

     1     6     9

     1     6    10

     1     6    11