R:映射稀疏矩阵中所有条目的方法

时间:2012-09-29 01:13:20

标签: r vectorization sparse-matrix

我有一个从R的Matrix包创建的稀疏矩阵。我想迭代矩阵中的每个条目并执行一个操作,将结果保存在另一个稀疏矩阵中,其索引与原始矩阵相同。

例如,假设我有稀疏矩阵A:

1 . 1
2 . .
. . 4

ColSums看起来像:

3 . 5

RowSums看起来像:

2
2
4

我想迭代A并执行此操作

(1,1) > 3*2
(2,1) > 2*3
(1,3) > 2*5
(3,3) > 4*5

创建B:

6 . 10
6 . .
. . 20

我将如何以矢量化方式进行此操作?

我认为函数foo看起来像:

B=fooMap(A,fun)

乐趣如下:

fun(row,col) = RowSums(row) * ColSums(col)

什么是fooMap?

编辑:

我选择了flodel的解决方案。它使用summary将稀疏矩阵转换为i,j,x数据帧,然后使用&朋友在该帧上执行操作,然后将结果转换回稀疏矩阵。使用这种技术,with / within运算符是fooMap;稀疏矩阵必须首先转换为i,j,x数据帧,以便可以使用with / within。

这是一个解决这个特殊问题的单线程。

B = with(summary(A), sparseMatrix(i=i, j=j, x = rowSums(A)[i] * colSums(A)[j]))

2 个答案:

答案 0 :(得分:4)

每当我对稀疏矩阵进行逐元素操作时,我就会在矩阵本身和它的summary表示之间来回走动:

summ.B <- summary(A)
summ.B <- within(summ.B, x <- rowSums(A)[i]*colSums(A)[j])
B <- sparseMatrix(i = summ.B$i, j = summ.B$j, x = summ.B$x)
B
# 3 x 3 sparse Matrix of class "dgCMatrix"
#            
# [1,] 6 . 10
# [2,] 6 .  .
# [3,] . . 20

答案 1 :(得分:2)

这是一种适用于每一步稀疏矩阵的方法。

## Load library and create example sparse matrix
library(Matrix)
m <- sparseMatrix(i = c(1,2,1,3), j = c(1,1,3,3), x = c(1,2,1,4))

## Multiply each cell by its respective row and column sums.
Diagonal(x = rowSums(m)) %*% (1*(m!=0)) %*% Diagonal(x = colSums(m))
# 3 x 3 sparse Matrix of class "dgCMatrix"
#            
# [1,] 6 . 10
# [2,] 6 .  .
# [3,] . . 20

1*中的(1*(m!=0))用于将m!=0生成的类“lgCMatrix”的逻辑矩阵强制转换回数字矩阵类“dgCMatrix”。啰嗦(但也许更清楚)替代方案是在其位置使用as(m!=0, "dgCMatrix")。)