前言
最近motion graph
相关实验,发现实现运动过渡需要构建运动图,而为了避免运动过渡陷入死胡同,需要对图结构进行裁剪,方法就是计算图模型的极大强联通分量,但是自己懒得去实现,所以就去搜了一下matlab
中有无相关实现,果然找到了。
国际惯例,参考网址:
Find strongly or weakly connected components in graph
创建稀疏矩阵
正文
首先是创建图结构,主要是利用sparse
函数,直接看创建有向图需要指定的信息:
DG = sparse([1 1 1 2 2 3 3 4 5 6 7 7 8 9 9 9 9], ...[2 6 8 3 1 4 2 5 4 7 6 4 9 8 10 5 3],true,10,10)
前两个参数是维度相同的行向量,指定了图结构的某两个节点的连接,true
的意思是这两个节点具有有向连接,后面的(10,10)
意思是总共有10个节点。比如上述就说明了如下节点间有有向连接:
(2,1) 1
(1,2) 1
(3,2) 1
(2,3) 1
(9,3) 1
(3,4) 1
(5,4) 1
(7,4) 1
(4,5) 1
(9,5) 1
(1,6) 1
(7,6) 1
(6,7) 1
(1,8) 1
(9,8) 1
(8,9) 1
(9,10) 1
也可以用biograph
可视化所构建的图模型:
h=view(biograph(DG));
看着挺简单的,直接使用sparse
函数,指定某两个节点之间的连接状态即可。
寻找强连通分量的函数是graphconncomp
,调用方法也很简单,直接把sparse
定义的图结构丢进去:
[S,C] = graphconncomp(DG);
这里得到了两个输出,S
代表当前图结构中具有多少个强连通分量,C
分别指示了节点属于第几个强联通分量,比如上图的10个节点分属的强联通分量是4,4,4,1,1,2,2,4,4,3
,也可以可视化
%将强联通分量标记出来
colors = jet(S);
for i = 1:numel(h.nodes)h.Nodes(i).Color = colors(C(i),:);
end