[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