Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于另一个矩阵(矩阵包)对稀疏矩阵的元素进行调零_R_Matrix_Sparse Matrix - Fatal编程技术网

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。

我对其进行了修改,以帮助其他人避免与我相同的解释错误。第二行和第四行很简单。第三行是关键。如果你映射到一个单变量坐标列表,解决这个问题并不难。