2016-04-05 6 views
0

私は99927個のノードと131698個のリンクを持つグラフを持っています。as_adjacency_matrixと大きなグラフ

私はadjacence行列にこのグラフを変換する必要があるので、私が書く

g <- make_graph(unlist(sample), directed = FALSE) 
print(vcount(g)) 
print(ecount(g)) 
m <- as_adjacency_matrix(g, sparse = FALSE) 
# find selfloops 
num_selfloops <- sum(diag(m)) # this counts each edge in multi-edged self-loop 
# find multilinks 
num_multilinks <- sum(m > 1) 

しかし、このサイズのネットワークと、私はこのエラーを取得する:

Error in .Call("R_igraph_get_adjacency", graph, as.numeric(type), as.logical(edges), : 
    At vector.pmt:439 : cannot reserve space for vector, Out of memory 

私は、Windows 7を使用しています、64ビット、8 GBのRAMを搭載しています。

どうすれば解決できますか?

+1

あなたはそれをドンギングしています...それはまばらなことができますか? – user20650

+0

セルフループとマルチリンクの数を計算する必要があります。うーん、良い質問ですが、スパースかどうかわかりません。スパースであれば、セルフループとマルチリンクを計算できますか? – marielle

+0

私が知る限り、ほとんどのigraph関数は疎行列で動作します。独自の関数を記述している場合、通常の行列関数(選択、サブセット、バインディング)はスパース行列でも同様に動作します – user20650

答えて

0

元の質問に答えるには:このサイズのグラフでは、密行列がメモリにほとんどフィットしないため、疎な行列表現が必要です(ほとんどの場合、 )その上にひどく遅くなる:

> m <- as_adjacency_matrix(g, sparse = TRUE) 

あなたが唯一の複数のエッジや自己ループの数を必要とする場合は、あなたがすべての隣接行列表現を必要としません。 igraphには、これらのための組み込み関数があります。例えば、ループのエッジをカウントする:

> sum(which_loop(g)) 

which_loop(g)エッジIは、そうでなければ、ループ端とFALSEある場合、i番目の要素がTRUE論理ベクトルを返すので、これが動作します。

多重度> 1でエッジを数えることは、simplify()count_multiple()でも簡単です。 count_multiple()は各エッジの多重度を返します。これは、グラフのエッジ属性として追加することができます。

> E(g)$weight <- count_multiple(g) 

その後、我々はグラフを簡素化する、すなわちweight属性を保ち、すべての複数のエッジを削除します。

> g <- simplify(g, remove.multiple=TRUE, remove.loop=FALSE, edge.attr.comb="first") 

その後、我々は、単にどのように多くを数えますエッジはweight > 1です:

> sum(E(g)$weight > 1) 
関連する問題