我想从稀疏矩阵的第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
我试过这个使用申请,但一直无法解决问题,它并没有让我回复我想要的东西。矩阵的尺寸太大,我不想使用循环。感谢致敬。
答案 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 . .