On 12-06-24 4:50 PM, Søren Højsgaard wrote:
Dear all,

Indexing matrices from the Matrix package with [i,j] seems to be very slow. For 
example:

  library(rbenchmark)
  library(Matrix)
  mm<- matrix(c(1,0,0,0,0,0,0,0), nr=20, nc=20)
  MM<- as(mm, "Matrix")
  lookup<- function(mat){
    for (i in 1:nrow(mat)){
      for (j in 1:ncol(mat)){
         mat[i,j]
      }
    }
}

  benchmark(lookup(mm), lookup(MM),  columns=c("test", "replications", "elapsed", 
"relative"), replications=50)
        test     replications elapsed relative
1 lookup(mm)           50    0.01           1
2 lookup(MM)           50    8.77      877

I would have expected a small overhead when indexing a matrix from the Matrix 
package, but this result is really surprising...
Does anybody know if there are faster alternatives to [i,j] ?

There's also a large overhead when indexing a dataframe, though Matrix appears to be slower. It's designed to work on whole matrices at a time, not single entries. So I'd suggest that if you need to use [i,j] indexing, then try to arrange your code to localize the access, and extract a submatrix as a regular fast matrix first. (Or if it will fit in memory, convert the whole thing to a matrix just for the access. If I just add the line

mat <- as.matrix(mat)

at the start of your lookup function, it becomes several hundred times faster.)

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to