[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