我发现使用igraph 0.7.1获得边缘权重(或其他边缘属性)很慢。令人惊讶的是,获取一条边的属性的计算时间与获取整个边的属性没有太大区别:
library(igraph)
set.seed(1)
g = erdos.renyi.game(10000,0.1)
E(g)$weight = runif( ecount(g) )
system.time( E(g)[1]$weight )
system.time( E(g)[1:1E2]$weight )
system.time( E(g)[1:1E4]$weight )
system.time( E(g)[1:1E6]$weight )
system.time( E(g)[1:ecount(g)]$weight )
甚至,检索一条边的时间与检索整条边的时间差别不大:
system.time( E(g)[1] )
system.time( E(g)[1:1E2] )
system.time( E(g)[1:1E4] )
system.time( E(g)[1:1E6] )
system.time( E(g)[1:ecount(g)] )
甚至,计算一个顶点强度的时间与计算整个顶点强度的时间差别不大:
system.time( strength(g, 1) )
system.time( strength(g, 1:1E2) )
system.time( strength(g, 1:1E4) )
system.time( strength(g) )
回到我的目标,我如何有效地检索节点(例如1)和其他节点(例如2:10)之间边缘的权重。一种可能的方法是使用以下代码,但效率很低:
g[1, 2:10]