2017-05-04 65 views
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 ...我想避免永远不必在正常化的步骤分配的密集矩阵。)

唯一的半有效的方法,我发现身边这是applyP跨越行(更准确地说,通过强行进入密集子矩阵的行),但我想尝试从我的代码库中删除循环逻辑,如果可以的话,我想知道是否有一个内置于Matrix软件包(我只是不知道),这有助于这种特殊类型的计算。

干杯和感谢您的任何帮助!

-murat

回答

2

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

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

而对于山坳正常化,记得换乘法顺序: 'P%*%矩阵::对角线(x = 1/sqrt(Matrix :: colSums(P^2)))' – mdup