如何获得邻接矩阵,其中值是节点属性的差异

时间:2014-04-02 09:46:13

标签: r igraph

我有这样一个网络:

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)
    }
}

有没有更好的方法来完成这项任务?

2 个答案:

答案 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 . . . .
相关问题