У меня большая разреженная матрица (примерно 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 немного быстрее, но все же не так быстро, как мне нравится. Любые идеи, как я мог бы реализовать это более эффективно?