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