2017-11-27 9 views
3

私はいくつかの隣接行列の作成に取り組んでおり、奇妙な問題に遭遇しました。同じスパース行列、さまざまなオブジェクトサイズ

私は1と0の完全な1つの行列を持っています。私はそれの転置(t(X) %*% X)で乗算し、他のものを実行したいです。ルーチンが本当に遅くなったので、私はそれを明らかに速くなった疎マトリックスに変換しました。

しかし、スパース行列は、マトリックスをスパース形式に変換すると、サイズが2倍になります。ここで

は、その後、私は好奇心旺盛だ

set.seed(666) 
nr = 10000 
nc = 1000 

bb = matrix(rnorm(nc *nr), ncol = nc, nrow = nr) 
bb = apply(bb, 2, function(x) x = as.numeric(x > 0)) 

# Slow and unintelligent method 
op1 = t(bb) %*% bb 
op1 = Matrix(op1, sparse = TRUE) 

# Fast method 
B = Matrix(bb, sparse = TRUE) 
op2 = t(B) %*% B 

# weird 
identical(op1, op2) # returns FALSE 
object.size(op2) 
#12005424 bytes 
object.size(op1) # almost half the size 
#6011632 bytes 

# now it works... 
ott1 = as.matrix(op1) 
ott2 = as.matrix(op2) 

identical(ott1, ott2) # returns TRUE 

同じ問題に遭遇し、いくつかの一般的な例です。誰がなぜこれが起こるのか知っていますか?

答えて

4

op1のクラスはdsCMatrixであり、op2dgCMatrixである。 dsCMatrixは、対称行列のクラスであるため、上半分と対角(完全行列の約半分のデータ)を格納すればよいだけです。

高密度行列を疎行列に変換する文は、対称行列の対称クラスを選択するのに十分スマートなので、節約できます。明示的にテストisSym <- isSymmetric(data)を実行する関数Matrixのコードでこれを見ることができます。一方、速度については最適化されており、このチェックは行われません。

関連する問題