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

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)

我想创建一个新矩阵,通过对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吗? - Jaap
1个回答

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

谢谢,这正是我在寻找的!只有两个简短的问题:1)我应该如何修改代码以从右上角开始?2)是否可以通过应用某个角度(例如35度)的值的累积来进行对角线分析(关于所选角落之一)? - PaulG
据我所知,35度是不可能的;如果要从右上角开始,则必须将 col(A) 部分包含在 rev 中,如下所示:A[row(A)==rev(col(A))] - Jaap
非常感谢。我做了一些研究,没有看到使用角度完成此操作的可能性。无论如何,非常感谢您的热心帮助。这正是我在寻找的! - PaulG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接