保持矩阵中对角线的最大值

时间:2017-05-30 10:14:47

标签: r matrix

假设我有一个表示高程值的矩阵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)

有人可以帮我吗?

1 个答案:

答案 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