@ Arun answer seems better.
Now that I understand the problem (or me?). Here is a solution in the R base that uses the idea that only continuous sequences of zeros need to be supported.
find.ones <- function (mat) { ones <- rep(0, max(mat)) ones[c(mat)] <- 1 ones <- paste0(ones, collapse="") ones <- gsub("101", "111", ones) ones <- as.numeric(strsplit(ones, "")[[1]]) ones }
In the original OP example:
m <- matrix(c(1, 3, 4, 6, 11, 12, 13, 14), ncol=2, byrow=TRUE) find.ones(m) [1] 1 1 1 1 1 1 0 0 0 0 1 1 1 1
To evaluate the solution, make the matrix large enough:
set.seed(10) m <- sample.int(n=1e6, size=5e5) m <- matrix(sort(m), ncol=2, byrow=TRUE) head(m) [,1] [,2] [1,] 1 3 [2,] 4 5 [3,] 9 10 [4,] 11 13 [5,] 14 18 [6,] 22 23 system.time(ones <- find.ones(m)) user system elapsed 1.167 0.000 1.167
source share