提高速度的边缘重量计算图

  • 本文关键字:计算 边缘 高速度 r igraph
  • 更新时间 :
  • 英文 :


我有一个简单的问题。我正在尝试在我想进行一些计算的图中设置边缘的重量。我的工作代码如下: for(e in E(g)){ E(g)[e]$weight <- 1/(degree(g, v = V(g)[ends(g, e)][2], mode = "in")) }
对于小图,这可以正常工作。但是对于具有105K边缘的图,这需要太长(65分钟!!(是否有更有效的方法来做到这一点,我该如何更快地做到这一点?预先感谢!

您可以通过矢量化代码来使计算更快,从而完全避免使用for循环 - 这是重新计算每个节点的程度的频率,而不是:

library(igraph)
# A small toy graph to demonstrate
set.seed(234)
g <- random.graph.game(10, .25, directed = T)
# Your approach for constructing weights
for(e in E(g)){
  E(g)[e]$weight <- 1/(degree(g, v = V(g)[ends(g, e)][2], mode = "in"))
}
# Vectorized version
res <- 1/degree(g, v = V(g)[ends(g, E(g))[,2]], mode = "in")
# We test to make sure the results are the same
all.equal(E(g)$weight, res)
#> [1] TRUE
# To show how much faster it is lets make a big graph with ~100k edges
set.seed(42)
g <- random.graph.game(1000, .1, directed = T)
length(E(g))
#> [1] 99307
microbenchmark::microbenchmark(E(g)$weight <- 1/degree(g, v = V(g)[ends(g, E(g))[,2]], mode = "in"))
#> Unit: milliseconds
#>                                                                   expr
#>  E(g)$weight <- 1/degree(g, v = V(g)[ends(g, E(g))[, 2]], mode = "in")
#>       min       lq     mean   median       uq      max neval
#>  15.45099 57.88469 54.22476 59.22422 60.43034 106.6269   100

新版本在99,307的边缘上大约需要60毫秒。

最新更新