将1添加到大邻接矩阵的所有值

时间:2014-03-03 04:13:18

标签: r matrix graph igraph adjacency-matrix

我想从真实网络的现有图表中构建完整的图表。节点具有属性weight。完整图表应保留现有边缘的相同属性,并将新边缘的weight设置为0.

This solution适用于小图形(在我的32gb RAM实例上,最多约10K节点),但是带有80K +节点和80M边缘的图形,我的脚本killed由操作系统在{{1}行1}}。

然后我需要知道另一种解决方案是否可行。在下面的代码中,我使用g[V(g), V(g)] <- TRUE将图表转换为其邻接矩阵,将1添加到所有值,将其转换回get.adjacency()的完整图表,从所有graph.adjacency()中减去1,然后将原始图形中的所有节点属性传递给新的完整图形。

weight

这个技巧有效,但只适用于小图。瓶颈位于library(igraph) g <- erdos.renyi.game(5, 1/5) V(g)$size <- sample(1:10, vcount(g), replace=TRUE) V(g)$time <- sample(1:10000, vcount(g), replace=TRUE) E(g)$weight <- sample(1:10, ecount(g), replace=TRUE) adj <- get.adjacency(g, attr="weight", sparse=TRUE) adj <- adj + 1 g2 <- graph.adjacency(adj, mode="undirected", diag=FALSE, weighted=TRUE) E(g2)$weight <- E(g2)$weight - 1 V(g2)$size <- V(g)$size V(g2)$time <- V(g)$time g.full <- graph.full(5) vcount(g.full) == vcount(g2) # [1] TRUE V(g2)$size == V(g)$size # [1] TRUE TRUE TRUE TRUE TRUE V(g2)$time == V(g)$time # [1] TRUE TRUE TRUE TRUE TRUE ,对于大图给出

adj <- adj + 1

1 个答案:

答案 0 :(得分:2)

此错误与igraph没有多大关系。在get.adjacency之后你有一个稀疏图和

adj <- adj + 1

基本上将其转换为密集矩阵。要拥有80,000行/列的密集矩阵,您需要80,000 * 80,000 * 8字节的内存,大约48GB。实际上,即使你有那么多记忆,也很可能它不会起作用,因为R会想要至少复制一次矩阵,所以你需要两倍。

然后如果你想从它创建一个igraph图,你需要比这个~100GB更多的内存,因为igraph是为稀疏图设计的,如果图是密集的,它对内存效率不高。它需要(2 * n + 4 * m)* 8字节的存储器,其中n是顶点数,m是边数。重量需要另外m * 8字节的内存,每个属性需要另外(整数)属性的n * 4字节。

所以我建议使用一些图形分析软件将数据存储在磁盘上,或考虑另一种数据表示,例如: 存储零重量的边缘。