2013-08-21 44 views
1

提取反對角線我想提取數組從一個數組

m=array(1:18,c(3,3,2)) 

我最好的拍攝的反對角線

k=dim(m)[3] 

mn=matrix(nrow = k, ncol = 3) 

for (i in 1:k){ 
    mn=diag(m[,,i][3:1,1:3]) 
    } 

這將返回12 14 16,反角的第二陣列中的矩陣。我想要實現這個

[1] 3 5 7 
[2] 12 14 16 

我希望「反DIAGS」作爲陣列

手動diag(m[,,1][3:1,1:3])diag(m[,,2][3:1,1:3])工作正常,但我正在使用數組是dim(c(3,3,22)),所以我想「循環! 「

MQ:如何使用循環從數組中提取反對角線? (更好的和優雅的解決方案更受歡迎)

回答

2

這應該工作:

mn <- array(NA, dim=dim(m)) 
for (i in 1:dim(m)[3]){ 
    mn[,,i]=diag(m[,,i][cbind(3:1,1:3)]) 
       } 

目前還不清楚是否要「反診斷」成爲新的診斷,但是這是你的代碼的建議是什麼作爲意圖。表格matrix[cbind(vec1,vec2)]從矩陣中拉出(R,C)參考元素。

如果你不想讓他們爲數組,那麼這是一個備用的結果:

mn <- array(NA, dim=c(2,3)) 
    for (i in 1:dim(m)[3]){ 
     mn[i,]=m[,,i][cbind(3:1,1:3)] 
          } 
mn 
    [,1] [,2] [,3] 
[1,] 3 5 7 
[2,] 12 14 16 

這是得到相同值的無迴路方式:

m[cbind(rep(3:1,2), rep(1:3,2), rep(1:2,each=3)) ] 
[1] 3 5 7 12 14 16 
+0

謝謝@DWin。第二種解決方案就是我正在尋找的東西,我編輯了這個問題。感謝您在這種情況下解釋cbind。 – Adam

1

你可以在整個使用lapply通過首先旋轉矩陣(see this great answer),通過反轉列順序並取其對角線來提取反對角線。基本上是這樣的......

out <- lapply(1:dim(m)[3] , function(x) diag(t(apply(m[,,x] , 2 , rev)))) 
[[1]] 
[1] 3 5 7 

[[2]] 
[1] 12 14 16 

如果你需要它們粘在一起作爲一個數組,然後使用do.call ...

do.call(rbind , out) 
    [,1] [,2] [,3] 
[1,] 3 5 7 
[2,] 12 14 16 

在這種特殊情況下,一個for循環將更快(基準),你應該使用@迪文的答案。

它發生,我認爲我們可以simplfy這一點,並避免使用列表和不好用的lapply(通過假定m可用的lapply範圍之外),因爲我們也可以簡單地在你的矩陣的第三維apply 。因此,我們可以apply一次旋轉矩陣,然後取每個diag旋轉矩陣是這樣的...

rotM <- apply(m , 2:3 , rev)  
out <- t(apply(rotM , 3 , diag)) 
    [,1] [,2] [,3] 
[1,] 3 5 7 
[2,] 12 14 16 
+0

@ SimononO101,一個字很棒 – Adam

+1

@亞當謝謝。我添加了第二個解決方案,我覺得它很整潔。 –

+0

@ SimononO101,事實上迪文的速度更快。但是使用lapply非常棒(對我來說),因爲在這種情況下我不會考慮'apply family' – Adam