【发布时间】:2012-09-29 01:13:19
【问题描述】:
我有一个从 R 的 Matrix 包创建的稀疏矩阵。我想遍历矩阵中的每个条目并执行操作,将结果保存在另一个稀疏矩阵中,该矩阵与原始矩阵具有相同的索引。
例如,假设我有稀疏矩阵 A:
1 . 1
2 . .
. . 4
ColSum 看起来像:
3 . 5
RowSum 看起来像:
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]))
【问题讨论】:
标签: r vectorization sparse-matrix