[R] How would you avoid loops in this simple example?

Petr Savicky savicky at praha1.ff.cuni.cz
Sat Mar 19 21:42:07 CET 2011


On Sat, Mar 19, 2011 at 10:27:11AM -0700, zerfetzen wrote:
> I'm trying to code more R-like and avoid loops. Here is an example I'm having
> a hard time getting away from loops with, and the real matrices are rather
> large, and the computation is too time-consuming.
> 
> ### Dimensions
> N <- 2
> M <- 3
> P <- 4
> ### Array and Matrices
> nu <- array(NA,dim=c(N,M,P))
> Lambda <- matrix(1:12,P,M)
> F <- matrix(1:8,N,P)
> ### Loop to avoid
> for (i in 1:N) {for (m in 1:M) {for (p in 1:P) {
>      nu[i,m,p] <- Lambda[p,m] * F[i,p]
> }}}

Try the following

  Lambda1 <- aperm(array(Lambda, dim=c(P, M, N)), perm=c(3, 2, 1))
  F1 <- aperm(array(F, dim=c(N, P, M)), perm=c(1, 3, 2))
  nu1 <- Lambda1 * F1
  identical(nu, nu1)
  [1] TRUE

The function array() recycles its first argument, if the 
required dimension of the output is larger. The function
aperm() then puts the indices to the required order.

Hope this helps.

Petr Savicky.



More information about the R-help mailing list