2014-10-07 1 views
0

Я хочу вычесть i-е значение вектора из ненулевых значений i-й строки разреженной матрицы, например.Вычтите i-е значение вектора из ненулевых значений i-й строки разреженной матрицы в R

 [,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 

Я попытался это с помощью применить, но приют я не мог понять проблему, она не возвращает мне то, что я хочу. Размеры матрицы слишком велики, и я не хочу использовать петли. Спасибо и приветствую.

ответ

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) 
[email protected] <- [email protected] - vec[[email protected]+1] 
mat 
# 3 x 4 sparse Matrix of class "dgCMatrix"    
# [1,] . . 3 . 
# [2,] . 3 . 1 
# [3,] -2 -1 . . 
+0

Спасибо большое, это работает, хотя, так как им делать это вычисление на очень большой разреженной матрицы я получаю уведомление: Примечание : метод с сигнатурой 'Matrix # lsparseMatrix', выбранный для функции '*', целевая подпись 'dgeMatrix # lgCMatrix'. «dMatrix # lMatrix» также будет действительным – user37940

+0

Спасибо большое, это работает отлично :) – user37940

Смежные вопросы