Как эффективно удалить блоки в разреженной матрице в R - PullRequest
0 голосов
/ 21 марта 2019

У меня большая разреженная матрица (примерно 10 миллионов строк, 10000 столбцов, около 20 ненулевых записей в строке), и я хочу эффективно удалить некоторые ее блоки, где блок состоит из списка строк (от 1000 до 100000) и список столбцов (от 1 до 100).

Я попробовал два подхода, вот пример кода:

library(Matrix)

# given (random) sparse matrix
M <- sparseMatrix(i = sample(1:1000, 2000, replace=TRUE), 
              j = sample(1:1000, 2000, replace=TRUE), 
              dims=c(1000, 1000))

# given rows and columns to delete
to_del_row <- 1:20
to_del_col <- 1:10

# option 1:
row_sparse <- sparseMatrix(i=to_del_row, j=rep(1, length(to_del_row)), dims=c(1000, 1))
M[, to_del_col] <- M[, to_del_col] & !row_sparse[, 1]

# option 2:
row_sparse <- sparseMatrix(i=to_del_row, j=rep(1, length(to_del_row)), dims=c(1000, 1))
col_sparse <- sparseMatrix(i=rep(1, length(to_del_col)), j=to_del_col, dims=c(1, 1000))
to_del <- row_sparse %*% col_sparse
M[which(to_del, arr.ind = TRUE)] <- FALSE

Вариант 1 плох для разреженных матриц, потому что! разреженной матрицы не очень разреженной. Вариант 2 немного быстрее, но все же не так быстро, как мне нравится. Любые идеи, как я мог бы реализовать это более эффективно?

...