[R] Indexing matrices from the Matrix package with [i, j] seems to be very slow. Are there "faster alternatives"?

Duncan Murdoch murdoch.duncan at gmail.com
Mon Jun 25 11:27:14 CEST 2012


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.)



More information about the R-help mailing list