0

igraph 中是否有方法或类可以快速有效地执行此过程?

4

1 回答 1

3

假设您的图形在g其中,并且要使用的顶点集在sampled其中(这是一个由从零开始的顶点 ID 组成的向量)。

首先,我们选择至少一个端点位于的边集sampled

all.vertices <- (1:vcount(g)) - 1
es <- E(g) [ sampled %--% 1:n ]

es现在是一个“边缘序列”对象,由感兴趣的边缘组成。接下来,我们获取图的边列表(这是一个 mx 2 矩阵)并选择与边对应的行:

el <- get.edgelist(g)[as.vector(es)+1]

这里,as.vector(es)将边序列转换为由边序列中边的边 ID 组成的向量,并使用它来选择边列表的适当子集。请注意,我们必须将 1 添加到边 ID,因为 R 向量从 1 开始索引,但 igraph 边 ID 从零开始。

接下来,我们从边缘列表构造结果:

g1 <- graph(el, vcount(g), directed=is.directed(g))

请注意,g1它将包含与 一样多的顶点g。您可以按如下方式获取由采样顶点组成的子图:

g1 <- subgraph(g1, sampled)

igraph 0.6 及更高版本的用户注意:igraph 0.6 将切换到基于 1 的索引,而不是基于 0 的索引,因此无需从中减去 1 all.vertices,也无需将 1 添加到as.vector(es). 此外,igraph 0.6 将包含一个名为 的函数subgraph.edges,因此可以简单地使用它:

g1 <- subgraph.edges(g, es)
于 2012-03-17T10:58:23.047 回答