Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays R:使用索引矩阵从数组中提取矩阵_Arrays_R_Matrix - Fatal编程技术网

Arrays R:使用索引矩阵从数组中提取矩阵

Arrays R:使用索引矩阵从数组中提取矩阵,arrays,r,matrix,Arrays,R,Matrix,我用R编码,我有一个包含数据的三维数组(示例中为ab)。然后我有一个包含第三数组维(idx)索引的矩阵。此矩阵具有与数组相同的行数和列数。我想使用idx中包含的索引从数组中提取数据,以获得与idx维数相同的矩阵。请参见下面的示例: a <- c(1:9) b <- rev(a) #array of data ab <- array(c(a,b), dim = c(3,3,2)) ab , , 1 [,1] [,2] [,3] [1,] 1 4 7

我用R编码,我有一个包含数据的三维数组(示例中为ab)。然后我有一个包含第三数组维(idx)索引的矩阵。此矩阵具有与数组相同的行数和列数。我想使用idx中包含的索引从数组中提取数据,以获得与idx维数相同的矩阵。请参见下面的示例:

a <- c(1:9)
b <- rev(a)

#array of data
ab <- array(c(a,b), dim = c(3,3,2))
ab
, , 1

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

, , 2

     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    2
[3,]    7    4    1

#matrix of indices
idx <- matrix(sample(1:2,9,replace=TRUE), nrow = 3)
idx
     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    1    1
[3,]    1    1    1

#now I want to get the following matrix:
     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    8    5    8
[3,]    3    6    9

#these two don´t do the job
ab[idx]
ab[ , ,idx]

a我们需要一个行/列索引和第三维(来自“idx”)来提取元素。我们通过
cbind
ing行索引、列索引和'idx'来实现这一点

i1 <- dim(ab)[1]
j1 <- dim(ab)[2]
matrix(ab[cbind(rep(seq_len(i1),  j1),rep(seq_len(j1), each = i1), c(idx))], ncol=3)
#     [,1] [,2] [,3]
#[1,]    9    6    3
#[2,]    8    5    8
#[3,]    3    6    9

i1可能有点复杂,但它至少可以工作:
首先,我的idx:

        [,1] [,2] [,3]
[1,]    2    2    1
[2,]    1    2    1
[3,]    2    2    2
首先,我把它做成了一个向量:

idVec <- as.vector(idx)
d3mat <- apply(ab,3,as.vector)
len <- length(idVec)
len <- 1:len
resultvec <- sapply(len, function(x, vec, mat){return(mat[x,vec[x]])}, mat=d3mat, vec=idVec)
    matrix(resultVec,3,3)
     [,1] [,2] [,3]
[1,]    9    6    7
[2,]    2    5    8
[3,]    7    4    1