2009-08-13 11 views
11

options for working with sparse matrices in Rについて学んだら、Matrixパッケージを使用して、次のデータフレームからスパース行列を作成し、他のすべての要素をNAにします。デフォルトのエントリがNAであるスパース行列の作成(およびアクセス)

 s r d 
1 1089 3772 1 
2 1109 190 1 
3 1109 2460 1 
4 1109 3071 2 
5 1109 3618 1 
6 1109 38 7 

私は、私はいつものように要素にアクセスする、次のようにスパース行列を作成することができます知っている:

> library(Matrix) 
> Y <- sparseMatrix(s,r,x=d) 
> Y[1089,3772] 
[1] 1 
> Y[1,1] 
[1] 0 

を私はNAであることを、デフォルト値を持つようにしたい場合は、私は次のことを試してみました:

M <- Matrix(NA,max(s),max(r),sparse=TRUE) 
    for (i in 1:nrow(X)) 
    M[s[i],r[i]] <- d[i] 

と、このエラーを得た

Error in checkSlotAssignment(object, name, value) : 
    assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE 

それだけでなく、要素へのアクセスにはかなり時間がかかります。

> system.time(Y[3,3]) 
    user system elapsed 
    0.000 0.000 0.003 
> system.time(M[3,3]) 
    user system elapsed 
    0.660 0.032 0.995 

このマトリックスはどのように作成する必要がありますか?なぜ、1つのマトリックスがそれほど遅く動作するのですか?

は、ここでは上記のデータのためのコードスニペットです:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame") 

答えて

12

はい、ティエリーの答えは、私はあなたの他の質問に...「マトリックス」パッケージの共著者として

を言うことができます間違いなく本当です:なぜ「M」にアクセスしている「Y」より遅いですか? 主な答えは、 "M"は "Y"よりもはるかに疎であるため、プラットフォームのサイズとRAMに応じて、はるかに小さいオブジェクトではアクセス時間が短縮されます。それら。

+0

ありがとう!私はStackOverflowであなたの答えのより多くを見ることを楽しみにしています。 Matrixを使っている間に私が持っていた質問のいくつかを試してみましょう... –

+10

すべての非ゼロのセルが常に保存されることは残念です。 sparseMatrixに0以外のデフォルト値を指定できるといいでしょう。 – Quantum7

+1

私はsparseMatrixのデフォルト値があると考えていますか? – hs3180

15

デフォルトNA値をしたいのはなぜ?私が知る限り、行列はゼロセルを持つ場合にしか疎ではありません。 NAはゼロ以外の値なので、スパース行列のメリットはすべて失われます。古典的な行列は、行列にゼロがほとんどない場合、さらに効率的です。古典的な行列は、次元に応じてカットされるベクトルのようなものです。したがって、データベクトルと次元を格納するだけです。スパース行列は、ゼロ以外の値だけを格納しますが、その位置も格納します。十分なゼロ値がある場合にのみ、これは利点です。

+0

ええ、そうだと思います。 –

+1

私の "デフォルト"の値が1の場合、確かに1つの余分なビットの情報が格納されます。すなわち、デフォルトは0ではなく1です。0と同じように、その前提ははるかに一般的です。 – adunaic

+1

"これは、十分なゼロ値がある場合にのみ利点です。":単純に真ではありません。あなたのコメントの "ゼロ"のすべての出現を "1"または他の数字で置き換えると、あなたの文がまだ保持されていることがわかります。ゼロが使用されているという事実は慣例によるものであり、ゼロ以外のデフォルト値を持つことが理にかなっている多くのアプリケーションがあります。メモリ節約という点では、デフォルト値をデータセットで最も頻繁に発生する数値に設定するのが理にかなっています。 – derwiwie

関連する問題