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 であることを意味します。抽出する最も簡単な方法は何ですかT[i,j]=2 および T[l,k]=1 であるような A のすべての [i,j,l,k] エントリ。これは、タイプ 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 が 4 次元であるため、R がインデックスを作成する方法は、A[type.0,type.1] を実行できるようにならないことです。もちろん、ループでそれを行うこともできますが、それを行うためのより良い方法はありますか.

ここで過去の回答を見つけることができませんでしたが、何かを見逃した可能性があります。

これは、2 つのタイプ 0 と 1、位置 (1,1) の 2x2 ラティス、タイプ 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 のセルまでのすべての距離が必要です

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

最初の段落に記載されているものからリクエストを変更したと思います。これが2番目のバージョンに答えるかどうかを確認してください。

 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 に答える