2013-10-27 1 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'. Вы не можете добавлять ребра и обновлять вес других ребер за один шаг. Вы также не можете удалять ребра и добавлять края в один шаг. Btw. добавление весов не изменяет индексы внутреннего igraph, но в R он копирует весь график один раз. –

ответ

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) 

Initial Graph

то вы делаете:

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

Вы получаете 4x4 разреженную матрицу (0,1), где 1 в положении (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).подматрица для подключения (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

Смежные вопросы