R中的稀疏(dgCMatrix)矩阵行标准化

时间:2017-05-04 18:20:22

标签: r matrix sparse-matrix

我有一个大的稀疏矩阵,称之为P:

 > str(P)
   Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
   ..@ i       : int [1:7868093] 4221 6098 8780 10313 11102 14243 20570 22145 24468 24977 ...
   ..@ p       : int [1:7357] 0 0 269 388 692 2434 3662 4179 4205 4256 ...
   ..@ Dim     : int [1:2] 1303967 7356
   ..@ Dimnames:List of 2
   .. ..$ : NULL
   .. ..$ : NULL
   ..@ x       : num [1:7868093] 1 1 1 1 1 1 1 1 1 1 ...
   ..@ factors : list()

我想对行标准化(比如说,使用L-2规范)......(利用向量回收)这种直截了当的方法就像:

> row_normalized_P <- P / rowSums(P^2)

但这会导致内存分配错误,因为看起来rowSums结果会被回收到维度等于dim(P)密集矩阵中。 鉴于已知P是稀疏的(或者至少以稀疏格式存储),有没有人知道实现上面所示的所需row_normalized_P的非迭代方法? (即,结果矩阵与P本身一样稀疏......我想避免在规范化步骤中分配密集矩阵。)

我发现的唯一一种半效率方法是apply跨越P行(更准确地说是通过强制子矩阵的行块)chunkedMode: true,,但我想要如果可以的话,尝试从我的代码库中删除循环逻辑,我想知道是否可能在Matrix包中有一个内置(我只是不知道),这有助于这种特殊类型的计算。 / p>

欢呼并感谢您的帮助!

-murat

1 个答案:

答案 0 :(得分:2)

我找到了一个很好的解决方案(像往常一样,发布后约15分钟: - /)......

> row_normalized_P <- Matrix::Diagonal(x = 1 / sqrt(Matrix::rowSums(P^2))) %*% P