Search code examples
rperformanceformulaapplyindices

Optimize performance of a formula spanning three consecutive indices, with wraparound


I want to optimize the implementation of this formula.

Here is the formula: formula

x is an array of values. i goes from 1 to N where N > 2400000. For i=0, i-1 is the last element and for i=lastElement, i+1 is the first element. Here is the code which I have written:

   x <- 1:2400000
   re <- array(data=NA, dim = NROW(x))
   lastIndex = NROW(x)
   for(i in 1:lastIndex){
      if (i==1) {
        re[i] = x[i]*x[i] - x[lastIndex]*x[i+1]
      } else if(i==lastIndex) {
        re[i] = x[i]*x[i] - x[i-1]*x[1]
      } else {
        re[i] = x[i]*x[i] - x[i-1]*x[i+1]  
      }
    }

Can it be done by apply in R?


Solution

  • We can use direct vectorization for this

    # Make fake data
    x <- 1:10
    n <- length(x)
    # create vectors for the plus/minus indices
    xminus1 <- c(x[n], x[-n])
    xplus1 <- c(x[-1], x[1])
    
    # Use direct vectorization to get re
    re <- x^2 - xminus1*xplus1