从R中稀疏矩阵的第i行的非零值中减去向量的值

时间:2014-10-07 19:07:46

标签: r machine-learning sparse-matrix

我想从稀疏矩阵的第i行的非零值中减去矢量的第i个值,例如

     [,1] [,2] [,3] [,4]
[1,]    0    0    4    0
[2,]    0    5    0    3
[3,]    1    2    0    0

这是我想要减去的向量:

[1] 1 2 3

所以我最终需要的是:

     [,1] [,2] [,3] [,4]
[1,]    0    0    3    0
[2,]    0    3    0    1
[3,]   -2   -1    0    0

我试过这个使用申请,但一直无法解决问题,它并没有让我回复我想要的东西。矩阵的尺寸太大,我不想使用循环。感谢致敬。

1 个答案:

答案 0 :(得分:5)

由于逐列执行从矩阵中减去矢量,mat-vec执行必要的减法。由于您只想在原始矩阵非零时使用它(并且对于最初为0的元素返回0),您可以乘以mat != 0,即1/0(TRUE / FALSE)矩阵说明原始元素是否为非零。

(mat - vec) * (mat != 0)
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    3    0
# [2,]    0    3    0    1
# [3,]   -2   -1    0    0

如果您想要为稀疏矩阵执行此操作:

library(Matrix)
(mat <- sparseMatrix(i=c(3, 2, 3, 1, 2), j=c(1, 2, 2, 3, 4), x=c(1, 5, 2, 4, 3)))
# 3 x 4 sparse Matrix of class "dgCMatrix"
# [1,] . . 4 .
# [2,] . 5 . 3
# [3,] 1 2 . .
vec <- c(1, 2, 3)
mat@x <- mat@x - vec[mat@i+1]
mat
# 3 x 4 sparse Matrix of class "dgCMatrix"              
# [1,]  .  . 3 .
# [2,]  .  3 . 1
# [3,] -2 -1 . .