Хотя ваш вопрос касается разреженных матриц, мне кажется, ваш код на самом деле описывает стандартную матрицу.
Если это так, вы можете обработать матрицу 500x53380 за считанные секунды.Следующий код использует тот факт, что матрица внутренне хранится в R как вектор.Это означает, что вы можете применить одну векторную функцию по всей матрице.Предостережение заключается в том, что вам необходимо восстановить размеры матрицы впоследствии.
Вот иллюстрация с гораздо меньшей матрицей:
mr <- 5
mc <- 8
mat <- matrix(round(rnorm(mr*mc), 3), nrow=mr)
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] -1.477 1.773 1.630 -0.152 1.054 0.057 -1.260 0.999
[2,] -1.863 -0.312 -0.221 -0.102 0.892 -1.255 0.996 -0.193
[3,] -0.364 -0.059 2.317 1.156 0.893 0.225 0.392 -1.986
[4,] -1.123 -0.661 0.070 0.032 0.019 -1.763 -0.205 0.951
[5,] -0.111 -3.112 -0.970 -0.794 -1.372 -0.119 1.291 -0.680
mydim <- dim(mat)
mat[mat>0] <- 1
mat[mat<0] <- 0
dim(mat) <- mydim
mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 1 1 0 1 1 0 1
[2,] 0 0 0 0 1 0 1 0
[3,] 0 0 1 1 1 1 1 0
[4,] 0 0 1 1 1 0 0 1
[5,] 0 0 0 0 0 0 1 0
Повторение всего этого процесса для матрицы 500x53380 занимает ~ 12 секундна моей машине:
mr <- 500
mc <- 53380
system.time({
mat <- matrix(round(rnorm(mr*mc), 3), nrow=mr)
mydim <- dim(mat)
mat[mat>0] <- 1
mat[mat<0] <- 0
dim(mat) <- mydim
})
user system elapsed
12.25 0.42 12.88