[R] reverse array indexing

Peter Wolf s-plus at wiwi.uni-bielefeld.de
Thu Jul 31 12:00:05 CEST 2003


Richard A. O'Keefe wrote:

>Jerome Asselin <jerome at hivnet.ubc.ca> suggests this:
>	arr <- array(rnorm(27),c(3,3,3))
>	dimarr <- dim(arr)
>	tmparr <- array(1:prod(dimarr),dimarr)
>	sapply(c(3),function(x,tmparr) which(tmparr==x,T),tmparr=tmparr)
>	sapply(c(3,17,13,5),function(x,tmparr) which(tmparr==x,T),tmparr=tmparr)
>	
>Of course, in R we can simplify the last two lines to
>    sapply(<<argument goes here>>, function(x) which(tmparr==x,T))
>
>However, wearing my "computer scientist" hat, I have to wonder about costs.
>This is basically the equivalent of the APL "decode" operator.
>
>Let's define
>
>    index.decode <- function (index, array) {
>	dimarr <- dim(arr)
>	tmparr <- array(1:prod(dimarr), dimarr)
>	sapply(index, function(x) which(tmparr == x, T))
>    }
>
>The result is a matrix with C=length(index) columns
>and R=length(dim(array)) rows.  ...
>  
>
I think you mean the APL encode operator?

 > index<-1:8
 > encode(index-1,c(2,2,2))+1
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    1    1    2    2    2    2
[2,]    1    1    2    2    1    1    2    2
[3,]    1    2    1    2    1    2    1    2

download code of encode from:  
http://www.wiwi.uni-bielefeld.de/~wolf/software/R-wtools/decodeencode.rev

Peter Wolf




More information about the R-help mailing list