[R] Matrix mulitplication
Liaw, Andy
andy_liaw at merck.com
Tue Feb 17 19:03:36 CET 2004
Just do
system.time <- sys.time
and you're good to go in S-PLUS (at least in 6.x).
Andy
> From: Spencer Graves
>
> Dear Doug:
>
> Thanks for pointing out "system.time". I considered using that
> but didn't because it doesn't work under S-Plus 6.2. I could
> write my
> own, but ... .
>
> Regarding Gabor Grothendieck suggestion to use the
> Sherman-Morrison-Woodbury formula, this can also be used in recursive
> computations, and often is in Kalman filtering and other applications
> where BA is of reduced dimensionality.
>
> Best Wishes,
> spencer graves
>
> Douglas Bates wrote:
>
> >Spencer Graves <spencer.graves at pdf.com> writes:
> >
> >
> >
> >> One can also use "crossprod" AND use "solve" to
> actually "solve"
> >> the system of linear equations rather than just get
> the inverse,
> >> which is later multiplied by t(BA)%*%D. However, the
> difference
> >> seems very small:
> >>
> >>
> >
> >Thanks for pointing that out Spencer. I was about to do the same.
> >
> >
> >
> >>set.seed(1)
> >>
> >> > n <- 500
> >> > A <- array(rnorm(n^2), dim=c(n,n))
> >> > B <- array(rnorm(n^2), dim=c(n,n))
> >> > C. <- array(rnorm(n^2), dim=c(n,n))
> >> > D <- array(rnorm(n^2), dim=c(n,n))
> >> >
> >> > BA <- B%*%A
> >> >
> >> > start.time <- proc.time()
> >> > A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D
> >> > proc.time()-start.time
> >>[1] 4.75 0.03 5.13 NA NA
> >> >
> >> > start.time <- proc.time()
> >> > A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D))
> >> > proc.time()-start.time
> >>[1] 4.19 0.01 4.49 NA NA
> >>
> >>
> >
> >A minor point on the methodology. You can do this in one step as
> >
> >system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >
> >Also, in R the second and subsequent timings tend to be a bit faster
> >than the first. I think this is due to heap storage being allocated
> >the first time that large chunks of memory are used and not
> needing to
> >be allocated for subsequent uses.
> >
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.78 0.09 0.87 0.00 0.00
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.71 0.05 0.76 0.00 0.00
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.79 0.08 0.87 0.00 0.00
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.72 0.04 0.76 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.52 0.07 0.59 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.53 0.06 0.59 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.56 0.03 0.59 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.54 0.05 0.59 0.00 0.00
> >
> >
> >
> >> > all.equal(A1, A2)
> >>[1] TRUE
> >>
> >> This was in R 1.8.1 under Windows 2000 on an IBM Thinkpad T30
> >> with a Mobile Intel Pentium 4-M, 1.8Ghz, 1Gbyte RAM. The same
> >> script under S-Plus 6.2 produced the following elapsed times:
> >> [1] 3.325 0.121 3.815 0.000 0.000
> >>
> >>
> >
> >This is using R-devel (to be 1.9.0) on a 2.0 GHz Pentium-4 desktop
> >computer running Linux and with Goto's BLAS. I'm not sure exactly
> >which of the changes from your system are resulting in the
> much faster
> >execution time but it is definitely not all due to the
> processor speed.
> >My guess is that most of the gain is due to the optimized BLAS.
> >Goto's BLAS are a big win on a Pentium-4 under Linux. (Thanks to
> >Brian Ripley for modifying the configure script for R to accept
> >--with-blas=-lgoto .)
> >
> >Corresponding timings on a Athlon XP 2500+ (1.83 GHz) running Linux
> >with Atlas are
> >
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 1.29 0.04 1.34 0.00 0.00
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.88 0.06 0.95 0.00 0.00
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.79 0.05 0.85 0.00 0.00
> >
> >
> >>system.time(A1 <- A%*%solve(t(BA)%*%BA+C.)%*%BA%*%D)
> >>
> >>
> >[1] 0.82 0.04 0.87 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.61 0.06 0.67 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.66 0.02 0.69 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.51 0.10 0.61 0.00 0.00
> >
> >
> >>system.time(A2 <- A%*%solve(crossprod(BA)+C., crossprod(t(BA), D)))
> >>
> >>
> >[1] 0.59 0.10 0.71 0.00 0.00
> >
> >There you can see the faster execution of the second and subsequent
> >timings.
> >
> >I completely agree with you that using crossprod and the non-inverse
> >form of solve, where appropriate, helps. However, one of the best
> >optimizations for numerical linear algebra calculations is the use of
> >optimized BLAS. (I will avoid going in to the Linux vs Windows
> >comparisons :-)
> >
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
>
>
------------------------------------------------------------------------------
Notice: This e-mail message, together with any attachments,...{{dropped}}
More information about the R-help
mailing list