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. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.