2016-01-03 6 views
1

Look at the image У меня есть граф G и его матрица смежности. Я хочу преобразовать его в линейный граф L (G), так что узлы графа G становятся ребрами в L (G) и наоборот.
Есть ли какой-либо пакет в R, который может выполнять такую ​​обмену от узлов к краям и кромкам к узлам?Как преобразовать граф в его эквивалентный граф Графа Графа/Границы Графа/Перемена в R?

ответ

4

я написал небольшую функцию, которая вычисляет матрицу смежности линейного графика:

LineGraph <- function(A)  # A: adjacency matrix 
{ 
    n <- nrow(A) 
    m <- sum(A)/2    # m: number of edges 

    X <- lower.tri(A)*A   # X: still the adjacency matrix, 
    X[which(X!=0)] <- 1:m  # but edges are numbered 

    p <- which(X!=0)-1 
    edgeNames <- apply(matrix(c((p %% n)+1,p %/% n+1),m),1, 
        function(v){paste(sort(v),collapse=".")})  # names of the edges 

    X <- X + upper.tri(X)*t(X) 

    A.line <- matrix(0,m,m)  # A.line will become the adjacency matrix of the line graph 
    rownames(A.line) <- edgeNames 
    colnames(A.line) <- edgeNames 

    apply(X,1, 
     function(x) 
     { 
      p <- which(x!=0) 
      q <- outer(x[p],m*(x[p]-1),"+") 
      A.line[c(q)] <<- 1   
     }) 

    A.line[(1:m)+m*(0:(m-1))] <- 0 

    return(A.line) 
} 

Пример:

> A <- matrix(c(0,1,1,1,0, 
+    1,0,0,0,1, 
+    1,0,0,1,0, 
+    1,0,1,0,1, 
+    0,1,0,1,0), 5, 5) 
> LineGraph(A) 
    1.2 1.3 1.4 2.5 3.4 4.5 
1.2 0 1 1 1 0 0 
1.3 1 0 1 0 1 0 
1.4 1 1 0 0 1 1 
2.5 1 0 0 0 0 1 
3.4 0 1 1 0 0 1 
4.5 0 0 1 1 1 0 
> 
+2

Я нашел line.graph (граф) в качестве общего кода для преобразования графа в его линейный график. Кстати спасибо. –

1

make_line_graph из igraph пакета преобразует график в его соответствующий линейный график.

Таким образом, используя матрицу смежности сверху

library(igraph) 
m <- make_line_graph(graph_from_adjacency_matrix(A, mode="undirected")) 

as_adjacency_matrix(m, sparse=FALSE) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] 0 1 1 1 0 0 
#[2,] 1 0 1 0 1 0 
#[3,] 1 1 0 0 1 1 
#[4,] 1 0 0 0 0 1 
#[5,] 0 1 1 0 0 1 
#[6,] 0 0 1 1 1 0 
Смежные вопросы