Skip to content

code optimisation problem

5 messages · 47, Rui Barradas, Charles C. Berry +2 more

47
#
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) 
}

<http://r.789695.n4.nabble.com/file/n4651030/Untitled.png> 



--
View this message in context: http://r.789695.n4.nabble.com/code-optimisation-problem-tp4651030.html
Sent from the R help mailing list archive at Nabble.com.
#
Hello,

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


#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:
#
Rui Barradas <ruipbarradas at sapo.pt> writes:
Or vectorize the function
user  system elapsed 
   5.01    0.00    5.00
user  system elapsed 
   1.92    0.00    1.91
user  system elapsed 
   0.11    0.00    0.11
Chuck
[...]
#
Or try the filter() function (with convolutional filter rep(1/3,3)).

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
#
or write the compute intense part in C and interface it to R.
On Wed, Nov 28, 2012 at 5:45 AM, William Dunlap <wdunlap at tibco.com> wrote: