[R] vectorizing a matrix computation

Ernesto Jardim ernesto at ipimar.pt
Tue Jul 20 13:17:50 CEST 2004


On Tue, 2004-07-20 at 10:54, Wolski wrote:
> Hallo Christoph!
> 
> Using apply and sweep.
> Both of them accept  as the second argument (MARGIN) a vector which specifies the dimension.
> 
> ?apply
> ?sweep.
> 
> To specify the subscripts accurately I always need some trials, and to run tests, so I cant you provide with the final solution.
> 
> Hope it helps anyway.
> 
> Sincerely Eryk.
> 
> 
> 
> *********** REPLY SEPARATOR  ***********
> 
> On 7/20/2004 at 11:31 AM Christoph Lehmann wrote:
> 
> >>>Dear R users
> >>>
> >>>I have a 4-dimensional matrix (actually several 3d (x,y, slices) 
> >>>matrices appended over time (volumes))
> >>>
> >>>say, e.g. I want to z-transform the data (subtract the mean and divide 
> >>>by the std-deviation)
> >>>
> >>>for (slice in 1:slices) {
> >>>     for (x in 1:x.dim) {
> >>>         for (y in 1:y.dim) {
> >>>         t <- as.matrix(my.matrix[x,y,slice,1:volumes])
> >>>         for (vol in 1:volumes) {
> >>>             my.matrix.transformed[x,y,slice,vol] <- 
> >>>(my.matrix[x,y,slice,vol] - mean(t))/sqrt(var(t))
> >>>             }
> >>>         }
> >>>     }
> >>>}
> >>>
> >>>how can I vectorize such a function using, one of the *apply functions?
> >>>
> >>>many thanks
> >>>
> >>>Cheers
> >>>
> >>>Christoph
> >>>

Hi,


You may try to use the "continuous indexing". Notice that if you have a
matrix with dim=c(3,3,2,2)

matriz<-array(rnorm(36, 2,2),dim=c(3,3,2,2))

matriz[1:3] calls matriz[,1,1,1]
matriz[4:6] calls matriz[,2,1,1]
matriz[10:12] calls matriz[,1,2,1] 

etc

I think you can use that to perform the calculations you want althought
I'm not sure you're vectorizing 

vec <- 1:36
fac <- rep(1:12, rep(3,12))
lapply(split(vec, fac), FUN=function(x){(x-mean(x))/sd(x)})

or simply

tapply(c(matriz),fac,FUN=function(x){(x-mean(x))/sd(x)})

Hope it helps

Best regards

EJ




More information about the R-help mailing list