我有一个简单的问题,我似乎无法绕过头脑。我有一个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列”中提取值。
我知道这应该是一个愚蠢的简单事情,但我在如何做到这一点上空白。提前谢谢!
答案 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