我有一个从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]))
答案 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")
。)