Re: [R] A faster way to calculate Trace?

From: Giovanni Petris <GPetris_at_uark.edu>
Date: Fri 27 Oct 2006 - 16:47:26 GMT

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@maths.uwa.edu.au>
> Sender: r-help-bounces@stat.math.ethz.ch
> Cc: r-help@stat.math.ethz.ch
> Precedence: list
>
> G'day Yongwan,
>
> >>>>> "YC" == YONGWAN CHUN <chun.49@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@maths.uwa.edu.au
> Australia http://www.maths.uwa.edu.au/~berwin
>
> ______________________________________________
> R-help@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@uark.edu ]
[ Department of Mathematical Sciences              ]
[ University of Arkansas - Fayetteville, AR 72701  ]
[ Ph: (479) 575-6324, 575-8630 (fax)               ]
[ http://definetti.uark.edu/~gpetris/              ]
[__________________________________________________]

______________________________________________
R-help@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.
Received on Sat Oct 28 03:04:52 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Fri 27 Oct 2006 - 17:30:12 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.