Skip to content

Index matrix to pick elements from 3-dimensional matrix

3 messages · juhana vartiainen, robin hankin, Tony Plate

#
Hi all

Suppose I have a dim=c(2,2,3) matrix A, say:

A[,,1]=
a b
c d

A[,,2]=
e f
g h

A[,,3]=
i j
k l

Suppose that I want to create a 2x2 matrix X, which picks elements from 
the above-mentioned submatrices according to an index matrix J referring 
to the "depth" dimension:
J=
1 3
2 3

In other words, I want X to be
X=
a j
g l

since the matrix J says that the (1,1)-element should be picked from 
A[,,1], the (1,2)-element should be picked from A[,,3], etc.

I have A and I have J. Is there an expression in A and J that creates X?

Thanks

Juhana

juhana at fief.se
#
Hello Juhana

try this (but there must be a better way!)



stratified.select <- function(A,J){
   out <- sapply(J,function(i){sample(A[,,i],1)})
   attributes(out) <- attributes(J)
   return(out)
}

A <- array(letters[1:12],c(2,2,3))
J <- matrix(c(1,2,3,3),2,2)


R>  stratified.select(A,J)
      [,1] [,2]
[1,] "b"  "i"
[2,] "g"  "k"
R>   stratified.select(A,J)
      [,1] [,2]
[1,] "d"  "j"
[2,] "f"  "l"
R>


best wishes

Robin
On Apr 26, 2005, at 05:16 am, juhana vartiainen wrote:

            
--
Robin Hankin
Uncertainty Analyst
Southampton Oceanography Centre
European Way, Southampton SO14 3ZH, UK
  tel  023-8059-7743
#
I'm assuming what you want to do is randomly sample from slices of A 
selected on the 3-rd dimension, as specified by J.  Here's a way that 
uses indexing by a matrix.  The cbind() builds a three column matrix of 
indices, the first two of which are randomly selected.  The use of 
replace() is to make the result have the same attributes, e.g., dim and 
dimnames, as J.

 > A <- array(letters[1:12],c(2,2,3))
 > J <- matrix(c(1,2,3,3),2,2)
 > replace(J, TRUE, A[cbind(sample(dim(A)[1], length(J), rep=T), 
sample(dim(A)[2], length(J), rep=T), as.vector(J))])
      [,1] [,2]
[1,] "b"  "l"
[2,] "f"  "k"
 > replace(J, TRUE, A[cbind(sample(dim(A)[1], length(J), rep=T), 
sample(dim(A)[2], length(J), rep=T), as.vector(J))])
      [,1] [,2]
[1,] "b"  "l"
[2,] "h"  "i"
 > replace(J, TRUE, A[cbind(sample(dim(A)[1], length(J), rep=T), 
sample(dim(A)[2], length(J), rep=T), as.vector(J))])
      [,1] [,2]
[1,] "c"  "l"
[2,] "h"  "k"
 >

-- Tony Plate
Robin Hankin wrote: