[R] code optimisation problem

cberry at tajo.ucsd.edu cberry at tajo.ucsd.edu
Wed Nov 28 01:53:15 CET 2012


Rui Barradas <ruipbarradas at sapo.pt> writes:

> Hello,
>
> Package 'compiler' is good at optimizing for loops. Try the following.
>

Or vectorize the function

> system.time(f1(x,10))
   user  system elapsed 
   5.01    0.00    5.00 
> system.time(f1.c(x,10))
   user  system elapsed 
   1.92    0.00    1.91 
> f2 <- function(v,k) diff(cumsum(c(0,v)),lag=k)/k
> system.time(f2(x,10))
   user  system elapsed 
   0.11    0.00    0.11 
> 
Chuck

>
> #install.packages('compiler')
> library(compiler)
> f1.c <- cmpfun(f1)
>
> N <- 1e6
> x <- rnorm(N)
> system.time(f1(x, 10))
>    user  system elapsed
>    6.77    0.06    6.83
> system.time(f1.c(x, 10))
>    user  system elapsed
>    2.57    0.00    2.57
>
>
> Hope this helps,
>
> Rui Barradas
>
> Em 27-11-2012 21:43, 47 escreveu:
>> I'd like to write a function that has a vector and a (pos.) number as inputs
>> and returns what is on the picture below (arithmetic means of (k)
>> consecutive elements of a given vector). The problem is it works too slow
>> for long vectors and i know it can be done without "for" loop. However, i've
>> got no idea how. Can anyone help me with that?
>>
>> f1 <- function(v,k) {
>>    n <- length(v)
>>    z <- (n-k+1)
>>    for (i in k:n) {
>>      v[i-k+1] <- sum(v[(i-k+1):i])
>>    }
>>    v <- v[1:(n-k+1)]
>>    v <- v/k
>>    return (v)
>> }
[...]




More information about the R-help mailing list