2017-05-30 62 views
3

比方說,我有一個代表高程值的矩陣A:對角線上保持最高值矩陣

A = matrix(c(100,105,106,109,101,101,106,104,107,106,101,102,105,106,108,102,102,104,110,104), 
      nrow=5, ncol=4) 

我想創建創制出一個矩陣的對角分析一個新的矩陣。從前例開始。左上角我想分析每個對角線並保持最大值一步一步。預期結果應如下:

B = matrix(c(100,105,106,109,101,101,106,105,107,109,101,102,106,106,108,102,102,102,110,106), 
      nrow=5, ncol=4) 

有人能幫助我嗎?

+0

根據你的描述,我認爲你的'B'矩陣中的一個值是不正確的:'B [3,4]'。這不應該是'104'嗎? – Jaap

回答

2

如果我理解正確,比您想要每個對角線的累積最大值。隨着cummax和兩個for循環,你可以得到你想要的東西:

A[row(A)==col(A)] <- cummax(A[row(A)==col(A)]) 

for(i in 1:(nrow(A)-1)) { 
    A[row(A)==col(A)-i] <- cummax(A[row(A)==col(A)-i]) 
} 

for(i in 1:(ncol(A)-1)) { 
    A[row(A)-i==col(A)] <- cummax(A[row(A)-i==col(A)]) 
} 

現在矩陣A樣子:

> A 
    [,1] [,2] [,3] [,4] 
[1,] 100 101 101 102 
[2,] 105 106 102 102 
[3,] 106 105 106 104 
[4,] 109 107 106 110 
[5,] 101 109 108 106 

您還可以在如果一個函數把這個包您需要更頻繁地使用此程序:

diagcummax <- function(m) { 
    m[row(m)==col(m)] <- cummax(m[row(m)==col(m)]) 

    for(i in 1:(nrow(m)-1)) { 
    m[row(m)==col(m)-i] <- cummax(m[row(m)==col(m)-i]) 
    } 

    for(i in 1:(ncol(m)-1)) { 
    m[row(m)-i==col(m)] <- cummax(m[row(m)-i==col(m)]) 
    } 
    m 
} 

然後你只需要做:

diagcummax(A) 

,以獲得期望的結果。


如果你想從右上角以STRAT,然後向下離開,你需要包括rev在函數的一些要點:

diagcummax.upright <- function(m) { 
    m[row(m)==rev(col(m))] <- rev(cummax(rev(m[row(m)==rev(col(m))]))) 

    for(i in 1:(nrow(m)-1)) { 
    m[row(m)==rev(col(m))-i] <- rev(cummax(rev(m[row(m)==rev(col(m))-i]))) 
    } 

    for(i in 1:(ncol(m)-1)) { 
    m[row(m)-i==rev(col(m))] <- rev(cummax(rev(m[row(m)-i==rev(col(m))]))) 
    } 
    m 
} 

現在用:

diagcummax.upright(A) 

返回以下矩陣:

 [,1] [,2] [,3] [,4] 
[1,] 100 101 101 102 
[2,] 105 106 102 102 
[3,] 106 104 105 104 
[4,] 109 107 106 110 
[5,] 107 106 110 104 
+0

謝謝,那正是我正在尋找的!只是兩個簡短的問題:1)我應該如何修改代碼從右上角開始? 2)是否可以通過在特定角度(例如,所選角落)上應用某個角度的累積值來進行對角線分析? – PaulG

+0

@PaulG據我所知,35度是不可能的;對於從右上角開始,你必須像這樣在'rev'中包括col(A)'-part:'A [row(A)== rev(col(A))]' – Jaap

+0

@PaulG更新,HTH – Jaap