假设我具有4维n×n×n×n阵列A.A是距离矩阵,使得A [i,j,l,k]是从位置i,j到位置对l,k的距离。假设我有一个位置类型为T的nxn矩阵,假设类型可以是0,1或2,所以T [i,j] = 2表示i,jth位置是类型2.提取的最简单方法是什么A的所有[i,j,l,k]条目使得T [i,j] = 2并且T [l,k] = 1,意味着所有路径从类型1位置到类型2位置的距离。
我的想法是使用像
这样的东西type.0 = which(T == 0, arr.ind=T)
type.1 = which(T == 1, arr.ind=T)
type.2 = which(T == 2, arr.ind=T)
但问题在于,因为A是四维的,所以R的索引方式不像你可以做A [type.0,type.1]。当然我可以用循环来做,但是有更好的方法。
我在这里找不到过去的答案,但可能我错过了一些东西。
这是一个简单的测试用例,有两个类型0和1,一个2x2点阵位置(1,1),类型0(1,2),类型0,(2,1),类型1和(2) ,2)类型1。
A = array(c(0,1,1,1.4,1,0,1.4,1,1,1.4,0,1,1.4,1,1,0), dim = c(2, 2, 2, 2))
T = matrix(c(0,1,0,1),2,2)
我想要从0型单元格到1型单元格的所有距离
答案 0 :(得分:1)
我猜你已经改变了第一段所述的要求。看看这是否回答了第二个版本。
A [ cbind( which(T == 0, arr.ind=TRUE), which(T == 1, arr.ind=TRUE) )]
#[1] 1 1
(起初我以为你可能需要abind但cbind工作正常。)
答案 1 :(得分:1)
我的猜测是有更优雅的方式来做到这一点。它的灵感来自于DWin的解决方案,但它负责从0型到1型电池的所有潜在组合。如果你们想到更好的方式,请告诉我们
> type
[,1] [,2] [,3]
[1,] 0 0 1
[2,] 0 1 0
type.0 = which(type == 0, arr.ind=T) #locations of type 0 cells
type.1 = which(type == 1, arr.ind=T) #locations of type 1 cells
nlocs0 = length(type.0[,1]) #number of locations of type 0
nlocs1 = length(type.1[,1]) #number of locations of type 1
reploc0 = rbind( do.call(rbind, rep(list(type.0), nlocs1)) ) #rbinded on top of itself nloc1 times
reploc1 = rbind( do.call(rbind, rep(list(type.1[1,]), nlocs0)) ) #rbinding the first location of type.1 on top of itself nlocs0 times
if(nlocs1>1){
for(i in 2:nlocs1){
reploc1 = rbind( rbind( do.call(rbind, rep(list(type.1[i,]), nlocs0)) ), reploc1)
}
}
d0_1 = A[cbind(reploc0,reploc1)]