Skip to content
Prev 139913 / 398502 Next

How to remove double loop?

Jonas Malmros wrote:
Killing one of those loops is quite simple. The other may be
harder.
This is straightforward: notice that most R arithmetic
functions that operate in scalars also operate in vectors, 
matrices and arrays. For example, sin(pi) is zero, but
sin(c(0,pi/2,pi,3*pi/2)) is c(0, 1, 0, -1) (with some
rounding errors).

The loop in _i_ is just to take the max of a column? So:

OVal[1:(n+1), n+1] <- # this is a vector
  max(Val[1:(n+1), n+1] -  # this is another vector
    - K, 0)   # vector - scalar = vector, max(vector) = vector

or, in one line:

OVal[1:(n+1), n+1] <- max(Val[1:(n+1), n+1] - K, 0)

You can drop the indices, as you are taking all of them:

OVal[,n+1] <- max(Val[,n+1] - K, 0)
The inner loop is simple, but somehow tricky.

You are computing each j-th term as the same j-th term combined
with the (j+1)-th term. So, you take a combination of js in
the 1:i range and combine with js in the 2:(i+1) range... So:

    OVal[1:i, i] <- a*((1-p)*OVal[1:i, i+1] + p*OVal[2:(i+1), i+1])

The outer loop (in i) probably can't be optimized.

Alberto Monteiro