[英]Zeroing elements of a sparse matrix, based on another matrix (Matrix Package)
我有W
這是一個4萬行的二進制稀疏矩陣。 我正在使用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中實現這個?
我假設一個4,000,000x4,000,000矩陣,否則第1行將返回錯誤'A和B內部尺寸必須匹配'。
我難以復制你的問題。 見下文。
> 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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.