R 基于另一个矩阵(矩阵包)对稀疏矩阵的元素进行调零
我有R 基于另一个矩阵(矩阵包)对稀疏矩阵的元素进行调零,r,matrix,sparse-matrix,R,Matrix,Sparse Matrix,我有W这是一个400万行的二进制稀疏矩阵。我正在使用矩阵包。 我希望能够计算以下各项: W2 = W %*% W #W2 becomes a dgCMatrix W2@x[ W2@x > 1 ] = 1 W2 = W2 - W W2@x[ W2@x < 0 ] = 0 W2=W%*%W#W2成为dgCMatrix W2@x[ W2@x > 1 ] = 1 W2=W2-W W2@x[ W2@x < 0 ] = 0 不幸的是,这个操作中的第三行完全破坏了我的计
W
这是一个400万行的二进制稀疏矩阵。我正在使用矩阵包。
我希望能够计算以下各项:
W2 = W %*% W #W2 becomes a dgCMatrix
W2@x[ W2@x > 1 ] = 1
W2 = W2 - W
W2@x[ W2@x < 0 ] = 0
W2=W%*%W#W2成为dgCMatrix
W2@x[ W2@x > 1 ] = 1
W2=W2-W
W2@x[ W2@x < 0 ] = 0
不幸的是,这个操作中的第三行完全破坏了我的计算机。我能够很好地计算第(1)行和第(2)行,但当我尝试计算第(3)行时,R需要比我可用的内存多得多的内存。我确信W2-W
比单独W2
更稀疏
是否有任何向量形式的算法允许将
W2
的位置归零,即W
中的1?有没有有效的方法在R中实现这一点 我假设矩阵为4000000x4000000,否则第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()
>库(矩阵)
>W W0
>str(W)
具有6个插槽的正式类“lgCMatrix”[包“矩阵”]
..@i:int[1:1600000]623428 717198 3216269 3398149 3888958 3970651 3106201 61257 370389 3031066。。。
..@p:int[1:4000001]023345667。。。
..@Dim:int[1:2]4000000
..@Dimnames:2个列表
.. ..$ : 无效的
.. ..$ : 无效的
..@x:logi[1:1600000]对错对错对。。。
..@factors:list()
>W2街(W2)
具有6个插槽的正式类“dgCMatrix”[包“矩阵”]
..@i:int[1:638322]908991 1031349 2979756 1924552 3421130 992757 1375889 2872056 3161609 3389210。。。
..@p:int[1:4000001]0。。。
..@Dim:int[1:2]4000000
..@Dimnames:2个列表
.. ..$ : 无效的
.. ..$ : 无效的
..@x:num[1:638322]100 01 10。。。
..@factors:list()
> W2@x[ W2@x > 1 ] = 1
>W2=W2-W
> W2@x[ W2@x < 0 ] = 0
>str(W2)
具有6个插槽的正式类“dgCMatrix”[包“矩阵”]
..@i:int[1:2238320]623428 717198 3216269 3398149 3888958 3970651 3106201 61257 370389 908991。。。
..@p:int[1:4000001]023345667。。。
..@Dim:int[1:2]4000000
..@Dimnames:2个列表
.. ..$ : 无效的
.. ..$ : 无效的
..@x:num[1:2238320]01。。。
..@factors:list()
值得注意的是,在我的示例中,您的第2行没有任何作用,因为W%*%W只返回1和0。我对其进行了修改,以帮助其他人避免与我相同的解释错误。第二行和第四行很简单。第三行是关键。如果你映射到一个单变量坐标列表,解决这个问题并不难。