Hi:


On Sun, Dec 26, 2010 at 4:18 AM, bbslover <dluthm@yeah.net> wrote:

>
> Dear all,
>
> My double for loop as follows, but it is little efficient, I hope all
> friends can give me a "vectorized" program to replace my code. thanks
>
> x: is a matrix  202*263,  that is 202 samples, and 263 independent
> variables
>
> num.compd<-nrow(x); # number of compounds
> diss.all<-0
> for( i in 1:num.compd)
>   for (j in 1:num.compd)
>      if (i!=j) {
>

Isn't this just X'X?

>        S1<-sum(x[i,]*x[j,])
>
Aren't each of S2 and S3 just diag(X'X)?

>        S2<-sum(x[i,]^2)
>
       S3<-sum(x[j,]^2)
>        sim2<-S1/(S2+S3-S1)
>        diss2<-1-sim2
>        diss.all<-diss.all+diss2}
>

I tried
s1 <- crossprod(x)
s2 <- diag(s1)
s3 <-outer(s2, s2, '+') - s1
s1/s3

This yields a symmetric matrix with 1's along the diagonal and quantities
between 0 and 1 in the off-diagonal. Something like it could conceivably be
used as a similarity matrix. Is that what you're looking for with sim2?

I agree with Berend: it looks like a problem that could be easily solved
with some matrix algebra. R can do matrix algebra quite efficiently,
y'know...

(BTW, I tried this on a 1000 x 1000 input matrix:
system.time(myfunc(x))
   user  system elapsed
   0.99    0.02    1.02

I expect it could be improved by an order of magnitude if one actually knew
what you were computing... )

HTH,
Dennis

it will cost a long time to finish this computation! i really need "rapid"
> code to replace my code.
>
> thanks
>
> kevin
>
>
> --
> View this message in context:
> http://r.789695.n4.nabble.com/how-to-replace-my-double-for-loop-which-is-little-efficient-tp3164222p3164222.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help@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.
>

	[[alternative HTML version deleted]]

