What you're doing is breaking up the calculation of X'X
into n steps. I'm not sure what you mean by "very slow":
> X = matrix(rnorm(1000*50),1000,50)
> n = 1000
> system.time({C=matrix(0,50,50);for(i in 1:n)C = C + (X[i,] %o% X[i,])})
user system elapsed
0.096 0.008 0.104
Of course, you could just do the calculation directly:
> system.time({C1 = t(X) %*% X})
user system elapsed
0.008 0.000 0.007 > all.equal(C,C1)
[1] TRUE
- Phil Spector
Statistical Computing Facility
Department of Statistics
UC Berkeley
spector at stat.berkeley.edu
On Tue, 1 Mar 2011, AjayT wrote:
> Hi, I'm new to R and stats, and I'm trying to speed up the
following sum,
>
> for (i in 1:n){
> C = C + (X[i,] %o% X[i,]) # the sum of outer products - this is very
slow
> according to Rprof()
> }
>
> where X is a data matrix (nrows=1000 X ncols=50), and n=1000. The sum has
to
> be calculated over 10,000 times for different X.
>
> I think it is similar to estimating a co-variance matrix for demeaned data
> X. I tried using cov, but got different answers, and it was'nt much
quicker?
>
> Any help gratefully appreciated,
>
> --
> View this message in context:
http://r.789695.n4.nabble.com/Speed-up-sum-of-outer-products-tp3330160p3330160.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> 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.
>