gpt4 book ai didi

r - 通过使用 igraph (R) 组合事件顶点的属性来创建边缘属性

转载 作者:行者123 更新时间:2023-12-01 14:01:35 25 4
gpt4 key购买 nike

对于图中的每条边,我想添加一个数字属性(权重),它是事件顶点的属性(概率)的乘积。我可以通过在边缘上循环来做到这一点;即:

    for (i in E(G)) {
ind <- V(G)[inc(i)]
p <- get.vertex.attribute(G, name = "prob", index=ind)
E(G)[i]$weight <- prod(p)
}

但是,这对于我的图形来说非常慢(|V| ~= 20,000 和 |E| ~= 200,000)。有没有更快的方法来执行此操作?

最佳答案

这可能是最快的解决方案。关键是矢量化。

library(igraph)
G <- graph.full(45)
set.seed(1)
V(G)$prob <- pnorm(vcount(G))

## Original solution
system.time(
for (i in E(G)) {
ind <- V(G)[inc(i)]
p <- get.vertex.attribute(G, name = "prob", index=ind)
E(G)[i]$wt.1 <- prod(p)
}
)
#> user system elapsed
#> 1.776 0.011 1.787

## sapply solution
system.time(
E(G)$wt.2 <- sapply(E(G), function(e) prod(V(G)[inc(e)]$prob))
)
#> user system elapsed
#> 1.275 0.003 1.279

## vectorized solution
system.time({
el <- get.edgelist(G)
E(G)$wt.3 <- V(G)[el[, 1]]$prob * V(G)[el[, 2]]$prob
})
#> user system elapsed
#> 0.003 0.000 0.003

## are they the same?
identical(E(G)$wt.1, E(G)$wt.2)
#> [1] TRUE
identical(E(G)$wt.1, E(G)$wt.3)
#> [1] TRUE

矢量化解决方案似乎快了大约 500 倍,尽管需要更多更好的测量来更精确地评​​估它。

关于r - 通过使用 igraph (R) 组合事件顶点的属性来创建边缘属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27432809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com