2

我有一个从 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?

编辑:

我选择了弗洛德尔的解决方案。它使用 summary 将稀疏矩阵转换为 i,j,x 数据帧,然后使用 with & friends 对该帧执行操作,然后将结果转换回稀疏矩阵。使用这种技术,with/within 运算符是 fooMap;只需首先将稀疏矩阵转换为 i,j,x 数据帧,以便可以使用 with/within。

这是解决此特定问题的单线。

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

2 回答 2

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
于 2012-09-29T10:54:17.110 回答
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*in(1*(m!=0))被用来强制将生成的类“lgCMatrix”的逻辑矩阵m!=0返回到一个数字矩阵类“dgCMatrix”。一个更长的(但可能更清晰)的替代方案将用于as(m!=0, "dgCMatrix")代替它。)

于 2012-09-29T02:53:45.710 回答