0

假设我有一个 4 维 nxnxnxn 数组 A。A 是一个距离矩阵,因此 A[i,j,l,k] 是从位置 i,j 到位置对 l,k 的距离。假设我有一个位置类型 T 的 nxn 矩阵,假设类型可以是 0、1 或 2,所以 T[i,j]=2 意味着第 i,j 个位置是类型 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,位置为 (1,1)、类型 0 (1,2)、类型 0、(2,1)、类型 1 和 (2,2) 的 2x2 点阵类型 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 型细胞的所有距离

4

2 回答 2

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)]
于 2013-05-30T00:17:48.810 回答
1

我猜您已经更改了第一段中所述的请求。看看这是否回答了第二个版本。

 A [ cbind( which(T == 0, arr.ind=TRUE), which(T == 1, arr.ind=TRUE) )]
#[1] 1 1

(起初我以为你可能需要 abind 但 cbind 工作正常。)

于 2013-05-29T21:22:21.973 回答