Большая разреженная матрица в треугольную матрицу R
У меня есть очень большой (около 91 миллиона ненулевых записей) sparseMatrix () в R, который выглядит следующим образом:
> myMatrix
a b c
a . 1 2
b 1 . .
c 2 . .
Я хотел бы преобразовать его в треугольную матрицу (верхнюю или нижнюю), но при попытке myMatrix = myMatrix * lower.tri(myMatrix) возникает ошибка, что "проблема слишком велика" для lower.tri (). Хотите знать, если кто-нибудь может знать о решении. Спасибо за любую помощь!
1 ответ
Решение
Вместо того, чтобы работать над самой матрицей, работайте над ее summary
:
library(Matrix)
myMatrix <- sparseMatrix(
i = c(1,1,2,3),
j = c(2,3,1,1),
x = c(1,2,1,2))
myMatrix
# 3 x 3 sparse Matrix of class "dgCMatrix"
#
# [1,] . 1 2
# [2,] 1 . .
# [3,] 2 . .
mat.summ <- summary(myMatrix)
lower.summ <- subset(mat.summ, i >= j)
sparseMatrix(i = lower.summ$i,
j = lower.summ$j,
x = lower.summ$x,
dims = dim(myMatrix))
# 3 x 3 sparse Matrix of class "dgCMatrix"
#
# [1,] . . .
# [2,] 1 . .
# [3,] 2 . .
Это немного быстрее, когда у вас большая разреженная матрица:
ind <- which(myMatrix@i > myMatrix@j)
myMatrix_lower <- sparseMatrix(i = myMatrix@i[ind],
j = myMatrix@j[ind],
x = myMatrix@x[ind] ,
dims = dim(myMatrix),
giveCsparse = F, index1 = FALSE)