0
我有一个大稀疏矩阵,称其为,P:稀疏(dgCMatrix)矩阵的行归一化中的R
> str(P)
Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
[email protected] i : int [1:7868093] 4221 6098 8780 10313 11102 14243 20570 22145 24468 24977 ...
[email protected] p : int [1:7357] 0 0 269 388 692 2434 3662 4179 4205 4256 ...
[email protected] Dim : int [1:2] 1303967 7356
[email protected] Dimnames:List of 2
.. ..$ : NULL
.. ..$ : NULL
[email protected] x : num [1:7868093] 1 1 1 1 1 1 1 1 1 1 ...
[email protected] factors : list()
我想行归一化(比方说,用L-2范数)。 ..(利用矢量回收的)的直接方法会是这样的:
> row_normalized_P <- P/rowSums(P^2)
但是,这会导致内存分配错误,因为它出现在rowSums
结果被回收到密集矩阵尺寸等于dim(P)
。 鉴于P
已知是稀疏的(或至少以稀疏格式存储),是否有人知道非迭代方法来实现上面所示的期望row_normalized_P
? (即所产生的矩阵将同样作为稀疏本身P
...我想避免永远不必在正常化的步骤分配的密集矩阵。)
唯一的半有效的方法,我发现身边这是apply
P
跨越行(更准确地说,通过强行进入密集子矩阵的行),但我想尝试从我的代码库中删除循环逻辑,如果可以的话,我想知道是否有一个内置于Matrix软件包(我只是不知道),这有助于这种特殊类型的计算。
干杯和感谢您的任何帮助!
-murat
而对于山坳正常化,记得换乘法顺序: 'P%*%矩阵::对角线(x = 1/sqrt(Matrix :: colSums(P^2)))' – mdup