[R] A faster way to calculate Trace?
Giovanni Petris
GPetris at uark.edu
Fri Oct 27 18:47:26 CEST 2006
You can cut execution time by another 50% by using crossprod.
> n <- 1000
> a <- matrix(rnorm(n*n),n,n)
> b <- matrix(rnorm(n*n),n,n)
> system.time(print(sum(diag(a %*% b))))
[1] -905.0063
[1] 8.120 0.000 8.119 0.000 0.000
> system.time(print(sum(a*t(b))))
[1] -905.0063
[1] 1.510 0.000 1.514 0.000 0.000
> system.time(print(crossprod(as.vector(a), as.vector(t(b)))))
[,1]
[1,] -905.0063
[1] 0.700 0.000 0.705 0.000 0.000
> system.time(print(sum(diag(a %*% b %*% a %*% b))))
[1] 1266733
[1] 24.550 0.000 24.567 0.000 0.000
> system.time({
+ cmat <- a %*% b
+ print(crossprod(as.vector(cmat), as.vector(t(cmat))))
+ })
[,1]
[1,] 1266733
[1] 8.930 0.010 8.941 0.000 0.000
Cheers,
Giovanni
> Date: Fri, 27 Oct 2006 08:42:11 +0800
> From: Berwin A Turlach <berwin at maths.uwa.edu.au>
> Sender: r-help-bounces at stat.math.ethz.ch
> Cc: r-help at stat.math.ethz.ch
> Precedence: list
>
> G'day Yongwan,
>
> >>>>> "YC" == YONGWAN CHUN <chun.49 at osu.edu> writes:
>
> YC> I want to know how to get trace of product of matrices
> YC> **faster** when the matrices are really big. Unfortunately the
> YC> matrices are not symmetric. If anybody know how to get the
> YC> trace of it, please help me. An example is as below.
> The first one is quite simple to speed up:
>
> > n <- 2500
> > a <- matrix(rnorm(n*n),n,n)
> > b <- matrix(rnorm(n*n),n,n)
> > sum(diag(a %*% b))
> [1] 1890.638
>
> > tb <- t(b)
> > sum(a*tb)
> [1] 1890.638
>
> For the second one, you may try:
>
> > sum(diag(a %*% b %*% a %*% b))
> [1] 10668786
> > cmat <- a %*% b
> > sum(cmat*t(cmat))
> [1] 10668786
>
> It gives somewhat a speedup, since you only have to multiply two huge
> matrices once instead of thrice, but I wonder whether further
> improvements are possible.
>
> Hope this helps.
>
> Cheers,
>
> Berwin
>
> ========================== Full address ============================
> Berwin A Turlach Tel.: +61 (8) 6488 3338 (secr)
> School of Mathematics and Statistics +61 (8) 6488 3383 (self)
> The University of Western Australia FAX : +61 (8) 6488 1028
> 35 Stirling Highway
> Crawley WA 6009 e-mail: berwin at maths.uwa.edu.au
> Australia http://www.maths.uwa.edu.au/~berwin
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>
>
--
__________________________________________________
[ ]
[ Giovanni Petris GPetris at uark.edu ]
[ Department of Mathematical Sciences ]
[ University of Arkansas - Fayetteville, AR 72701 ]
[ Ph: (479) 575-6324, 575-8630 (fax) ]
[ http://definetti.uark.edu/~gpetris/ ]
[__________________________________________________]
More information about the R-help
mailing list