[R] matrix row product and cumulative product
Jeff Laake
Jeff.Laake at noaa.gov
Mon Aug 18 04:49:07 CEST 2008
I spent a lot of time searching and came up empty handed on the
following query. Is there an equivalent to rowSums that does product or
cumulative product and avoids use of apply or looping? I found a rowProd
in a package but it was a convenience function for apply. As part of a
likelihood calculation called from optim, I’m computing products and
cumulative products of rows of matrices with far more rows than columns.
I started with apply and after some thought realized that a loop of
columns might be faster and it was substantially faster (see below).
Because the likelihood function is called many times I’d like to speed
it up even more if possible.
Below is an example showing the cumprod.matrix and prod.matrix looping
functions that I wrote and some timing comparisons to the use of apply
for different column and row dimensions. At this point I’m better off
with looping but I’d like to hear of any further suggestions.
Thanks –jeff
> prod.matrix=function(x)
+ {
+ y=x[,1]
+ for(i in 2:dim(x)[2])
+ y=y*x[,i]
+ return(y)
+ }
> cumprod.matrix=function(x)
+ {
+ y=matrix(1,nrow=dim(x)[1],ncol=dim(x)[2])
+ y[,1]=x[,1]
+ for (i in 2:dim(x)[2])
+ y[,i]=y[,i-1]*x[,i]
+ return(y)
+ }
> N=10000000
> xmat=matrix(runif(N),ncol=10)
> system.time(cumprod.matrix(xmat))
user system elapsed
1.07 0.09 1.15
> system.time(t(apply(xmat,1,cumprod)))
user system elapsed
29.27 0.21 29.50
> system.time(prod.matrix(xmat))
user system elapsed
0.29 0.00 0.30
> system.time(apply(xmat,1,prod))
user system elapsed
30.69 0.00 30.72
> xmat=matrix(runif(N),ncol=100)
> system.time(cumprod.matrix(xmat))
user system elapsed
1.05 0.13 1.18
> system.time(t(apply(xmat,1,cumprod)))
user system elapsed
3.55 0.14 3.70
> system.time(prod.matrix(xmat))
user system elapsed
0.38 0.01 0.39
> system.time(apply(xmat,1,prod))
user system elapsed
2.87 0.00 2.89
> xmat=matrix(runif(N),ncol=1000)
> system.time(cumprod.matrix(xmat))
user system elapsed
1.30 0.18 1.46
> system.time(t(apply(xmat,1,cumprod)))
user system elapsed
1.77 0.27 2.05
> system.time(prod.matrix(xmat))
user system elapsed
0.46 0.00 0.47
> system.time(apply(xmat,1,prod))
user system elapsed
0.7 0.0 0.7
> xmat=matrix(runif(N),ncol=10000)
> system.time(cumprod.matrix(xmat))
user system elapsed
1.28 0.00 1.29
> system.time(t(apply(xmat,1,cumprod)))
user system elapsed
1.19 0.08 1.26
> system.time(prod.matrix(xmat))
user system elapsed
0.40 0.00 0.41
> system.time(apply(xmat,1,prod))
user system elapsed
0.57 0.00 0.56
> xmat=matrix(runif(N),ncol=100000)
> system.time(cumprod.matrix(xmat))
user system elapsed
3.18 0.00 3.19
> system.time(t(apply(xmat,1,cumprod)))
user system elapsed
1.42 0.21 1.64
> system.time(prod.matrix(xmat))
user system elapsed
1.05 0.00 1.05
> system.time(apply(xmat,1,prod))
user system elapsed
0.82 0.00 0.81
> R.Version()
$platform
[1] "i386-pc-mingw32"
.
.
.
$version.string
[1] "R version 2.7.1 (2008-06-23)"
More information about the R-help
mailing list