2

我想增加igraph图的邻接矩阵。我尝试了以下但没有成功:

require(igraph)
require(Matrix)
set.seed(123) # to get always the same graph (see "R reproducible example")
G <- igraph::erdos.renyi.game(20,10,type="gnm")
mat <- Matrix(1:16, ncol=4,nrow=4)
G[1:4, 1:4] <- mat
# Error in `[<-.igraph`(`*tmp*`, 1:4, 1:4, value = <S4 object of class "dgeMatrix">) : 
# New value should be NULL, numeric or logical

还尝试过: G[1:4, 1:4] <- as.numeric(mat)

# Error in `[<-.igraph`(`*tmp*`, 1:4, 1:4, value = c(1, 2, 3, 4, 5, 6, 7, :
# Logical or numeric value must be of length 1

我知道add.edges()函数,但似乎不会替换边缘,而是附加到权重?如果我对此有误,也请纠正我。

我是新手,R所以可以根据需要随意冗长。

谢谢

4

1 回答 1

1

如文档中所述,分配G[] <-仅采用一个逻辑值(即TRUE或)。 (类型: FALSE

?`[<-.igraph` 

并检查“索引运算符”部分)

因此,例如,如果您以这种方式创建图表:

require(igraph)
set.seed(144) # just to get the same initial graph
G <- igraph::erdos.renyi.game(10,5,type="gnm")

plot.igraph(G,layout=layout.kamada.kawai)

初始图

然后你做:

G[1:4,1:4]
>
[1,] . . . .
[2,] . . 1 .
[3,] . 1 . .
[4,] . . . .

你得到一个 的4x4稀疏矩阵(0,1),其中1at 位置(i,j)表示从i到有一条边j
如您所见,在这种情况下只有一条边2,3(显然3,2因为是无向图)

然后,通过设置,G[1:4,1:4] <- TRUE您将强制在 中的所有顶点之间建立一条边(1,4),相反,通过设置,G[1:4,1:4] <- FALSE您将删除 中的所有顶点之间的所有边(1,4)

因此,这些方法不太适合选择性地“批量更改”邻接矩阵,因为您只能创建或删除矩阵子集中的所有边。

在我看来,更好的方法可能是将这种方法与add.edges; 例如,如果你想改变(1,4)adj. 子矩阵连接(1,3)(2,4),你可以这样做:

G[1:4,1:4] <- FALSE # remove previous edges
G <- add.edges(G, c(1,3,2,4)) # add the new edges

事实上,再次绘制:

plot.igraph(G,layout=layout.kamada.kawai)

你会得到这个:

修正图

您可以在哪里看到边缘(2,3)已被消除,新的边缘(1,3)(2,4)已添加。

于 2013-10-27T11:44:04.513 回答