我有这样一个网络:
g1 <- erdos.renyi.game(10, 0.5)
V(g1)$time <- seq(1:10)
我知道igraph有一个get.adjacency()来从图中检索邻接矩阵,其中矩阵中的值是0(无链接)或1(存在链接),或者此值可以是1超出每个边缘属性...我必须检索邻接矩阵,但不是传统的0/1值或边缘属性,我需要在每个二元组的发送者和接收者之间有$ time的差异:
adj <- get.adjacency(g1)
dims <- dim(adj)
for(i in 1:dims[1]){
for(ii in 1:dims[2]){
adj[i,ii] <- (V(g1)[V(g1)==i]$time - V(g1)[V(g1)==ii]$time)
}
}
有没有更好的方法来完成这项任务?
答案 0 :(得分:1)
似乎你在循环中计算的不是邻接矩阵,而是最短路径的加权距离。无论如何,执行这些操作之一的方法是向边添加权重属性,这表示时间的差异。这比顶点的属性更容易处理。这是一个想法:
# your code
require(igraph)
g1 <- erdos.renyi.game(10, 0.5)
V(g1)$time <- 1:10
# adding a weight (difference in times)
E(g1)$weight <- apply(get.edgelist(g1), 1, function(i){
abs(V(g1)$time[i[1]]-V(g1)$time[i[2]])
})
# calculate adjacency and/or shortest path.
get.adjacency(g1, attr="weight")
shortest.paths(g1)
编辑您想要计算的差异似乎与图表完全没有关系。您可能只是在寻找outer
:
outer(V(g1)$time, V(g1)$time, "-")
答案 1 :(得分:0)
在这种情况下,使用边缘列表实际上更容易:
require(igraph)
require(Matrix)
g1 <- erdos.renyi.game(10, 0.5)
V(g1)$time <- 1:10
el <- get.edgelist(g1)
sparseMatrix(el[,1], el[,2], x=abs(el[,1]-el[,2]),
dims=rep(vcount(g1), 2), symmetric=TRUE)
# 10 x 10 sparse Matrix of class "dsCMatrix"
# [1,] . 1 2 3 . 5 6 . . .
# [2,] 1 . 1 . 3 4 5 6 7 8
# [3,] 2 1 . 1 2 3 4 . 6 7
# [4,] 3 . 1 . . 2 . . 5 .
# [5,] . 3 2 . . . 2 3 4 .
# [6,] 5 4 3 2 . . . . . 4
# [7,] 6 5 4 . 2 . . 1 . .
# [8,] . 6 . . 3 . 1 . 1 .
# [9,] . 7 6 5 4 . . 1 . .
# [10,] . 8 7 . . 4 . . . .