[R] matrix row product and cumulative product

Moshe Olshansky m_olshansky at yahoo.com
Mon Aug 18 08:40:32 CEST 2008


Hi Jeff,

If I understand correctly, the overhead of a loop is that at each iteration the command must be interpreted, and this time is independent of the number of rows N. So if N is small this overhead may be very significant but when N is large this should be very small compared to the time needed to multiply N pairs of numbers. 


--- On Mon, 18/8/08, Jeff Laake <Jeff.Laake at noaa.gov> wrote:

> From: Jeff Laake <Jeff.Laake at noaa.gov>
> Subject: [R] matrix row product and cumulative product
> To: r-help at r-project.org
> Received: Monday, 18 August, 2008, 12:49 PM
> 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)"
> 
> ______________________________________________
> R-help at 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.



More information about the R-help mailing list