[R] Speeding up

Van Campenhout Bjorn bjorn.vancampenhout at ua.ac.be
Mon Jul 9 15:12:13 CEST 2007


Hi R-helpers,

I am new in programming and R, so this may be basic.  I need to speed up
a procedure where I minimize some function on different partitions of
the data. I can do this with a loop, as for instance in:

i<-1
meanmin<-Inf
while (i<length(x)) {
	ind<-x<xord[i]
	if (some function to be minimized<meanmin) {
		meanmin<-some function to be minimized
		indmin<-xord[i]
	}
i<-i+1
}
print(indmin)

I learned that I should avoid loops, so I found the following
alternative:

dmat<-outer(x,xord,"<")*1 
ss<-apply(dmat,2,function (z) some function to be minimized)
indmin<-xord[which.min(ss)]
print(indmin)

But this does not lead to spectacular improvements (obviously, this is
dependent on the function and the length of x, and this dmat does not
seem to be an elegant solution to me).  Is there scope for substantial
improvement? Any pointers will be greatly appreciated.  Below an example
with some timings.


> set.seed(12345)
> x <- rnorm(1000, mean = 5, sd = 2)
> xord<-x[order(x)]
> 
> system.time({i<-1
+ meanmin<-Inf
+ while (i<length(x)) {
+ ind<-x<xord[i]
+ if ((mean(x*ind)+mean(x*!ind))<meanmin) {
+ meanmin<-mean(x*ind)+mean(x*!ind)
+ indmin<-xord[i]
+ }
+ i<-i+1
+ }
+ print(indmin)})
[1] 3.826595
   user  system elapsed 
   0.14    0.00    0.14 
> 
> 
> 
> system.time({dmat<-outer(x,xord,"<")*1 
+ ss<-apply(dmat,2,function (z) mean(x*z)+mean(x*!z))
+ indmin<-xord[which.min(ss)]
+ print(indmin)})
[1] 3.826595
   user  system elapsed 
   0.42    0.06    0.49 
> 
>



More information about the R-help mailing list