假设我有一个表示高程值的矩阵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)
我想创建一个新的矩阵,用A矩阵的对角线分析。从前开始左上角我想分析每个对角线并逐步保持最大值。预期结果应如下:
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 :(得分: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)
获得理想的结果。
如果您想要从右上角然后向左下角进行策略,则需要在函数的某些位置包含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