计算相邻边列表的最快方法(as_adj_edge_list)

时间:2015-09-17 07:18:45

标签: r igraph

这个问题几乎让我发疯。首先说我有一个示例定向图表,如:

g <- sample_gnp(20000, 0.1, directed = T)

现在我想计算一个所有传出边缘的“相互边缘”的比例。这是我想到的最快的方式:

ael <- as_adj_edge_list(graph, mode = "out")
sapply(ael, function(x) {mean(which_mutual(g, x))})

然而,as_adj_edge_list功能似乎需要无休止的时间。我的真实数据有大约23k个顶点和110k边缘,所以我不能只设置并等待代码完成。此外,通过搜索SO帖子,我发现as_adj_edge_list已经是迭代顶点或边缘的最快方法。那么我用愚蠢的方式吗?提前谢谢了。

1 个答案:

答案 0 :(得分:0)

如果转换模式为“相互”,则相互的egdes对应于图g.undir的无向版本g.dir的边缘。然后找出出局边缘之间的相互边缘的比例作为比率

  

g.dundir /'outgoing'-degree in g.dir

library(igraph)

g.dir <- sample_gnp(1000, 0.1, directed = T)

#-----------------------------------------

system.time(
{
  ael <- as_adj_edge_list(g.dir, mode = "out")
  A <- sapply(ael, function(x) {mean(which_mutual(g.dir, x))})

})

#-----------------------------------------

system.time(
{
  g.undir <- as.undirected(g.dir,mode="mutual")   
  d.dir <- degree(g.dir,mode="out")
  d.undir <- degree(g.undir)

  B <- d.undir/d.dir
})

identical(A,B)

> library(igraph)

> g.dir <- sample_gnp(1000, 0.1, directed = T)

> #-----------------------------------------
> 
> system.time(
+ {
+   ael <- as_adj_edge_list(g.dir, mode = "out")
+   A <- sapply(ael, function(x) { .... [TRUNCATED] 
   user  system elapsed 
  11.93    0.00   12.04 

> #-----------------------------------------
> 
> system.time(
+ {
+   g.undir <- as.undirected(g.dir,mode="mutual")   
+   d.dir <- degree(g.dir,mode .... [TRUNCATED] 
   user  system elapsed 
      0       0       0 

> identical(A,B)
[1] TRUE
>