根据2D矩阵值选择数组条目

时间:2016-10-13 11:16:09

标签: r

我有一个简单的问题,我似乎无法绕过头脑。我有一个3D阵列(图像堆栈),我正在尝试投影到2D阵列(例如图像堆栈的最大强度投影)。为此,我有一个索引矩阵,指示用于每个像素的z-stack。

例如,我有一个3D数组,如下所示:

, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

和“选择矩阵”看起来像这样:

     [,1] [,2]
[1,]    1    1
[2,]    2    2

此选择的结果应为

     [,1] [,2]
[1,]    1    3
[2,]    6    8

即。矩阵表示从哪个“z列”中提取值。

我知道这应该是一个愚蠢的简单事情,但我在如何做到这一点上空白。提前谢谢!

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是通过cbind

使用多维数组索引

以下是您的数据和选择矩阵:

d <- array(1:8,c(2,2,2))
selec <- matrix(c(1,2,1,2),2,2)

首先构建选择矩阵索引的网格:

selec.ind <- expand.grid(1:nrow(selec),1:ncol(selec))

然后将其与选择矩阵值一起使用以访问d

out <- matrix(d[cbind(selec.ind$Var1,selec.ind$Var2,as.vector(selec))], nrow(selec), ncol(selec))
##     [,1] [,2]
##[1,]    1    3
##[2,]    6    8

最后,将结果重新整形为选择矩阵的大小。

这适用于任何尺寸选择矩阵和z中的任意数量的图层。

答案 1 :(得分:0)

这仅适用于具有2个第三维(dim=c(...,...,2))的数组 数据:

ar=array(data=c(1,2,3,4,5,6,7,8),dim = c(2,2,2))
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8
selec=matrix(c(1,2,1,2),nrow = 2,ncol = 2)
     [,1] [,2]
[1,]    1    1
[2,]    2    2

我们使用ifelse

ifelse(selec==1,ar[,,1],ar[,,2])
     [,1] [,2]
[1,]    1    3
[2,]    6    8
相关问题