【问题标题】:Keeping maximum values on diagonals in matrix保持矩阵中对角线上的最大值
【发布时间】:2017-10-30 18:19:53
【问题描述】:

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

有人可以帮我吗?

【问题讨论】:

  • 根据您的描述,我认为您的B 矩阵中的一个值不正确:B[3,4]。不应该是104吗?

标签: r matrix


【解决方案1】:

如果我理解正确,那么您需要每个对角线的累积最大值。使用 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

【讨论】:

  • 谢谢,这正是我想要的!只是两个简短的问题:1)我应该如何修改代码以从右上角开始? 2)是否可以通过在某个角度(例如 35 度)(关于一个选定的角)应用数值的累积来进行对角线分析?
  • @PaulG 据我所知,35 度是不可能的;从右上角开始,您必须像这样将col(A)-part 包裹在rev 中:A[row(A)==rev(col(A))]
  • 非常感谢。我做了一些研究,没有看到任何可能用学位做这样的事情。无论如何,非常感谢您的帮助。这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2023-03-25
相关资源
最近更新 更多