使用conncomp

时间:2016-07-02 14:48:47

标签: matlab graph

问题

我正在尝试查找无向图的连接组件。 Matlabs函数conncomp就是这样做的。 Mathworks - connected graph components

示例

使用matlabs网页上给出的示例来保持简单和可重复:

G = graph([1 1 4],[2 3 5],[1 1 1],6);
plot(G)

Graph

 bins = conncomp(G)
    bins =
     1     1     1     2     2     3

对此的两个问题

第一个问题:使用此方法我如何找到初始节点索引,以便

     cluster1 = (1 2 3); (instead of ( 1 1 1))
     cluster2= (4 5);    (instead of (2 2))

第二个问题:

我正在研究一个大数据集,我知道很多节点没有连接,所以有没有办法只显示包含多个值的集群? 谢谢你的帮助,我主要被困在这里。

2 个答案:

答案 0 :(得分:1)

您可以在第一部分使用splitapply,如下所示:

clusters = splitapply(@(x) {x}, 1:numnodes(G), bins)

这将返回一个cell数组,其中每个单元格包含组中节点的索引。您可以使用cellfun

以常规方式对其进行过滤
discard = cellfun(@isscalar, clusters);
clusters(discard) = [];

(请注意splitapply是R2015b中的新功能 - 但OP使用的是graph,也是R2015b中的新功能,所以对它们来说应该没问题了)

答案 1 :(得分:1)

实际上问题的第一部分可以非常简单地回答,因为Matlabs conncomp为此提供了一个工具:

bins=conncomp(G,'OutputForm','cell');

创建一个包含群集的单元格数组,其中包含单元格中的所有节点名称。 对于问题的第二部分,我想有几种方法,但也可以使用这种方法:

clusters= bins(cellfun(@numel,bins)>1);