Is it possible to vectorise code like the following?
length(x) <- 100;
x[1] <- 1;
y <- rnorm(100);
for(i in 2:100) {
x[i] <- 2 * y[i] * x[i-1];
}
I appreciate that this is a trivial example, but it serves to illustrate the idea.
I often need to write code where the i-th value in a vector depends on the (i-1)-th value and if possible, I'd like to write this without needing a for
loop, as profiling suggests the functions with this type of operation are the major bottlenecks in my code.
Is this operation vectorizable so I do not need to use a for()
loop in the calculation?
You can write the non-vertorized code in C++:
Then call this function from R:
The interior of this plot command is equivalent. Rather interesting to repeatedly run it:
plot(c(1, 2^(2:length(x)-1)*cumprod(rnorm(99) )) )
In general, if you want a vectorised solution you need to solve the recurrence relation.
In the example you have you could work out the formula for x[i] and see if it can be vectorized. In this case I think cumprod might work.
For some cases case you can also use the
filter
command in convolution or recursive mode. See?filter
However if it is isn't possible to work out a formula for the n'th value that fits one of the molds above, you could try using a package like
inline
orRcpp
to write this in loop in C/C++.I don't have full details on this yet, but it looks the function
filter()
is going to be useful to do what I need.