2013-05-29 78 views
0

假設我有一個4維nxnxnxn數組A.A是一個距離矩陣,使得A [i,j,l,k]是距離位置的距離i,j到位置對l,k。假設我有位置類型T的n×n矩陣,可以說類型可以是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位置的所有路徑的距離。R:如何根據另一個矩陣提取多維數組值的集合

我的想法是使用類似

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是四維的渠道 - 做它的索引其不喜歡你可以做A [type.0,類型。 1]。當然,我可以用循環來做,但是有沒有更好的方法來做到這一點。

我在這裏找不到過去的答案,但它可能會遺漏一些東西。

這是一個簡單的測試用例,它有兩種類型0和1,位置(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

應該相當簡單。你已經跌倒了'which(,arr.ind = TRUE)'的詭計。爲什麼不發佈一個具有A和T實例的小測試用例? –

+0

測試用例現已發佈在 – MHH

+0

以上爲簡單起見,我僅對測試問題進行了類型0和1的測試,對不起 – MHH

回答

1

我的猜測是,有這樣做的更優雅的方式。它的靈感來自於迪文的解決方案,但負責所有從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)] 
1

我想你已經改變了從第一款規定的一個請求。看看這是否回答第二個版本。

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

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

+0

其實這是不正確的我認爲它給出了一些路徑的距離,但不是所有的路徑。 (1,1) - >(2,1),(1,1) - >(2,2),(1,2) - >(2,1) )或(1,2) - >(2,2),但我想如果你看看其中的大小(T == 0,arr.ind = TRUE)和大小(T == 1,arr .ind = TRUE),您可以適當地調整以獲得完整的答案。 – MHH

相關問題