"Полученный граф связен и прост" не прав: граф все еще направлен, а матрица смежности не симметрична.Например,
as_adjacency_matrix(graph)[1:5, 1:5]
# 5 x 5 sparse Matrix of class "dgCMatrix"
# dddd dddD ddDd ddDD dDdd
# dddd . . . . .
# dddD . . . . .
# ddDd . . . . .
# ddDD . . . . .
# dDdd . 1 . . .
Таким образом, в результате лапласиан также не будет симметричным.
Редактировать: , чтобы сделать график ненаправленным, мы можем использовать
adjm <- pmax(adjm, t(adjm))
all(adjm == t(adjm))
# [1] TRUE
Таким образом, оба элемента (i, j) и (j, i) заменяются на большее из двух.Интересно, что это все равно не делает симметрию Лапласа симметричной:
L_matrix[1:5, 1:5]
# dddd dddD ddDd ddDD dDdd
# dddd 1 0.00000000 0 0 0.0000000
# dddD 0 1.00000000 0 0 -0.0703125
# ddDd 0 0.00000000 1 0 0.0000000
# ddDD 0 0.00000000 0 1 0.0000000
# dDdd 0 -0.06575342 0 0 1.0000000
Проблема заключается в том, как работает normalized = TRUE
(похоже, ошибка; по крайней мере, это противоречит документации).Делая шаг нормализации вручную, мы имеем
L_matrix <- graph.laplacian(graph, norm = FALSE,
weights = E(graph)$weight,
sparse = FALSE)
L_matrix <- diag(1 / sqrt(diag(L_matrix))) %*% L_matrix %*% diag(1 / sqrt(diag(L_matrix)))
isSymmetric(L_matrix)
# [1] TRUE
L_matrix[1:5, 1:5]
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 0.00000000 0 0 0.00000000
# [2,] 0 1.00000000 0 0 -0.06799476
# [3,] 0 0.00000000 1 0 0.00000000
# [4,] 0 0.00000000 0 1 0.00000000
# [5,] 0 -0.06799476 0 0 1.00000000