基于另一个矩阵(矩阵包)对稀疏矩阵的元素进行归零

时间:2011-11-30 18:26:16

标签: r matrix sparse-matrix

我有W这是一个400万行二进制稀疏矩阵。我正在使用 Matrix 包。 我希望能够计算以下内容:

W2 = W %*% W             #W2 becomes a dgCMatrix
W2@x[ W2@x > 1 ] = 1
W2 = W2 - W
W2@x[ W2@x < 0 ] = 0

不幸的是,此操作中的第三行完全破坏了我的计算机。我能够很好地计算行(1)和(2),但是当我尝试计算行(3)时,R需要比我可用的RAM多得多的RAM。我确信W2 - WW2更“稀疏”。

是否有任何矢量形式的算法可以将W2的位置归零W为1?有没有有效的方法在R中实现这个?

1 个答案:

答案 0 :(得分:0)

我假设4,000,000x4,000,000矩阵,否则第1行将返回错误&A; B内部维度必须匹配&#39;。

我难以复制你的问题。见下文。

> library(Matrix)
> W<-rsparsematrix(nrow=4000000,ncol=4000000,density = .0000001)
> W<-W>0
> str(W)
Formal class 'lgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:1600000] 623428 717198 3216269 3398149 3888958 3970651 3106201 61257 370389 3031066 ...
  ..@ p       : int [1:4000001] 0 2 3 3 4 5 6 6 6 7 ...
  ..@ Dim     : int [1:2] 4000000 4000000
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : logi [1:1600000] TRUE FALSE TRUE TRUE FALSE TRUE ...
  ..@ factors : list()
> W2 <- W %*% W
> str(W2)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:638322] 908991 1031349 2979756 1924552 3421130 992757 1375889 2872056 3161609 3389210 ...
  ..@ p       : int [1:4000001] 0 0 0 0 0 0 0 0 0 0 ...
  ..@ Dim     : int [1:2] 4000000 4000000
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num [1:638322] 1 0 0 0 0 1 1 1 1 0 ...
  ..@ factors : list()     
> W2@x[ W2@x > 1 ] = 1
> W2 = W2 - W
> W2@x[ W2@x < 0 ] = 0
> str(W2)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:2238320] 623428 717198 3216269 3398149 3888958 3970651 3106201 61257 370389 908991 ...
  ..@ p       : int [1:4000001] 0 2 3 3 4 5 6 6 6 7 ...
  ..@ Dim     : int [1:2] 4000000 4000000
  ..@ Dimnames:List of 2
  .. ..$ : NULL
  .. ..$ : NULL
  ..@ x       : num [1:2238320] 0 0 0 0 0 0 0 0 0 1 ...
  ..@ factors : list()

值得注意的是,你的第2行在我的例子中没有做任何事情,因为W%*%W只返回1&0;和0&#39;