我有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 - W
比W2
更“稀疏”。
是否有任何矢量形式的算法可以将W2
的位置归零W
为1?有没有有效的方法在R中实现这个?
答案 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;