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

use*_*940 0 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
Run Code Online (Sandbox Code Playgroud)

这是我试图减去的向量:

[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

所以我最终需要的是:

     [,1] [,2] [,3] [,4]
[1,]    0    0    3    0
[2,]    0    3    0    1
[3,]   -2   -1    0    0
Run Code Online (Sandbox Code Playgroud)

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

jos*_*ber 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
Run Code Online (Sandbox Code Playgroud)

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

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 . .
Run Code Online (Sandbox Code Playgroud)