2013-10-27 125 views
2

我想增加igraph圖的鄰接矩陣。我嘗試沒有成功執行以下操作:在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(墊)

# 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的新手,所以請儘可能詳細。

由於

+0

我不確定你在這裏做什麼? 「替代邊緣」是什麼意思?如果要刪除頂點1:4中的邊,並添加矩陣中的邊,那麼只需使用'delete.edges()'和'add.edges()。 –

+0

通過'替換邊緣'我實際上意味着使用新的權重去除和替換邊緣權重,只需要一個更有效的步驟。當我說高效時,我的意思是隻更新需要它的位置上的節點的索引,而不是全部刪除,然後將全部添加到我想要的子矩陣中。我猜這可能是緩慢的,因爲節點索引必須更新兩次,以獲得子矩陣中的所有節點? – quine

+0

如果邊緣已經全部存在,那麼只需更新它們的權重。這可以用'G [from = ...,to = ...] < - newweigths'完成。您不能在一個步驟中添加邊和更新其他邊的權重。無法在單個步驟中刪除邊和邊。順便說一句。添加權重不會改變內部的圖形索引,但是在R中,它會複製整個圖形一次。 –

回答

1

分配G[] <-只需要一個邏輯值作爲文檔中所述(即TRUEFALSE)。
(類型:

?`[<-.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) 

Initial Graph

那麼你這樣做:

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

你得到的(0,1),一個4x4稀疏矩陣,其中1(i,j)位置表明,有一個從ij邊緣。
正如你所看到的,在這種情況下,只有一個邊緣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) 

你會得到這樣的:

Modified Graph

在那裏你可以看到該邊緣(2,3)已被淘汰,新邊緣(1,3)(2,4)已被添加。

+0

看來你是對的。這是做我所需要的最有效的方法。謝謝! – quine