4、图转换到其他R数据结构
图是对实体关系的表达,在igraph中,图可以转换为三种数据结构。
4-1 图转邻接矩阵:as_adjacency_matrix | as_adj
,结果是矩阵
邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵,但本函数使用无向图,有向图忽略边的方向,矩阵可以是上三角、下三角或一般矩阵,这通过参数type
设置;
百度百科:
邻接矩阵(Adjacency Matrix)是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:
①对无向图而言,邻接矩阵一定是对称的,而且主对角线一定为零(在此仅讨论无向简单图),副对角线不一定为0,有向图则不一定如此。
②在无向图中,任一顶点i的度为第i列(或第i行)所有非零元素的个数,在有向图中顶点i的出度为第i行所有非零元素的个数,而入度为第i列所有非零元素的个数。
③用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间。
> g <- sample_gnp(10, 2 / 10)
> as_adjacency_matrix(g)
10 x 10 sparse Matrix of class "dgCMatrix"
[1,] . . . . . . 1 . . .
[2,] . . . . 1 1 . . . .
[3,] . . . 1 . . . 1 . .
[4,] . . 1 . . . . . . .
[5,] . 1 . . . . . 1 1 .
[6,] . 1 . . . . . . . .
[7,] 1 . . . . . . . . 1
[8,] . . 1 . 1 . . . . .
[9,] . . . . 1 . . . . .
[10,] . . . . . . 1 . . .
可见,邻接矩阵用行位置和列位置来匹配边的起始顶点和终止顶点,如果两个顶点间存在一条边,就在交接处填入数字1。如果想找一条边起点,需要看该表在矩阵中的行号,终点需要看列号。
MIT 的Gilbert Strang教授在线性代数视频中,也用矩阵表示图,但他在起始顶点的位置填-1
,在终点位置填1
,他的表示法和igraph不同,矩阵所有元素之和是0,似乎有特殊的数学意义。
邻接矩阵,igraph默认填入数字1,如果想将边的属性值(比如边的权值)填入,可以通过设置参数attr = "weight
实现:
> E(g)$weight <- 2
> as_adjacency_matrix(g, attr = "weight")
10 x 10 sparse Matrix of class "dgCMatrix"
[[ suppressing 10 column names ‘a’, ‘b’, ‘c’ ... ]]
a . . . . . . 2 . . .
b . . . . 2 2 . . . .
c . . . 2 . . . 2 . .
d . . 2 . . . . . . .
e . 2 . . . . . 2 2 .
f . 2 . . . . . . . .
g 2 . . . . . . . . 2
h . . 2 . 2 . . . . .
i . . . . 2 . . . . .
j . . . . . . 2 . . .
igraph默认用顶点的ID号对应邻接矩阵的行号和列号,但如果设置了顶点的name属性,igraph会自动用顶点名替换邻接矩阵的行号
> V(g)$name <- letters[1:vcount(g)]
> as_adjacency_matrix(g)
10 x 10 sparse Matrix of class "dgCMatrix"
[[ suppressing 10 column names ‘a’, ‘b’, ‘c’ ... ]]
a . . . . . . 1 . . .
b . . . . 1 1 . . . .
c . . . 1 . . . 1 . .
d . . 1 . . . . . . .
e . 1 . . . . . 1 1 .
f . 1 . . . . . . . .
g 1 . . . . . . . . 1
h . . 1 . 1 . . . . .
i . . . . 1 . . . . .
j . . . . . . 1 . . .
4-2 专用函数:二部邻接矩阵as_biadjacency_matrix
据百度百科:二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(U,V),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in U,j in V),则称图G为一个二分图。
g <- make_bipartite_graph(c(