我有一个大的稀疏矩阵,称之为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
答案 0 :(得分:2)
我找到了一个很好的解决方案(像往常一样,发布后约15分钟: - /)......
> row_normalized_P <- Matrix::Diagonal(x = 1 / sqrt(Matrix::rowSums(P^2))) %*% P