Martin
Martin

Reputation: 195

How to avoid a loop here in R?

In my R program I have a "for" loop of the following form:

for(i in 1:I)  
{  
res[i] <- a[i:I] %*% b[i:I]   
}

where res, a and b are vectors of length I.

Is there any straightforward way to avoid this loop and calculate res directly? If so, would that be more efficient?

Thanks in advance!

Upvotes: 6

Views: 125

Answers (2)

ilir
ilir

Reputation: 3224

This is the "reverse cumsum" of a*b

rev(cumsum(rev(a) * rev(b)))

Upvotes: 9

Justin
Justin

Reputation: 43245

So long as res is already of length I, the for loop isn't "incorrect" and the apply solutions will not really be any faster. However, using apply can be more succinct...(if potentially less readable)

Something like this:

res <- sapply(seq_along(a), function(i) a[i:I] %*% b[i:I])

should work as a one-liner.


Expanding on my first sentence. While using the inherent vectorization available in R is very handy and often the fastest way to go, it isn't always critical to avoid for loops. Underneath, the apply family determines the size of the output and pre-allocates it before "looping".

Upvotes: 2

Related Questions