gpt4 book ai didi

r - 给定 R 中的二维数字 "height map"矩阵,如何找到所有局部最大值?

转载 作者:行者123 更新时间:2023-12-01 08:15:42 25 4
gpt4 key购买 nike

我有一个带有非负数值的 R 矩阵。该矩阵实际上是一个 2D 高度图,我想在这个矩阵中找到所有局部最大值。对于“平坦”峰,其中相邻元素彼此相等(并且它们共同是局部最大值),只要我在每个“平坦”区域内获得至少一个坐标,我就不关心会发生什么。

是否有任何功能可以有效地做到这一点?显然,我可以手动编写循环来逐个遍历和测试每个元素,但是在 R 中这样做会很慢。我需要对大约一百万个矩阵执行此操作,每个矩阵平均大约有 884 个元素。

理想情况下,会有一个函数将矩阵作为输入并返回一个 2 列矩阵,其中第 1 列是行坐标,第 2 列是列坐标,矩阵中的每个局部最大值对应一行。

允许矩阵边缘的局部最大值。矩阵之外的区域可以被视为具有零高度。

要使用的可重现示例矩阵:

set.seed(5)
msize <- 20 # Change this to whatever you like
x <- matrix(data=abs(rnorm(msize*2)), nrow=msize, ncol=msize)

最佳答案

focal() 包中的 raster 函数专为此类计算而设计。以下代码返回所有局部极大值的坐标,包括边缘坐标和作为“高原”部分的坐标。

library(raster)

## Construct an example matrix
set.seed(444)
msize <- 10
x <- matrix(sample(seq_len(msize), msize^2, replace=TRUE), ncol=msize)

## Convert it to a raster object
r <- raster(x)
extent(r) <- extent(c(0, msize, 0, msize) + 0.5)

## Find the maximum value within the 9-cell neighborhood of each cell
f <- function(X) max(X, na.rm=TRUE)
ww <- matrix(1, nrow=3, ncol=3) ## Weight matrix for cells in moving window
localmax <- focal(r, fun=f, w=ww, pad=TRUE, padValue=NA)

## Does each cell have the maximum value in its neighborhood?
r2 <- r==localmax

## Get x-y coordinates of those cells that are local maxima
maxXY <- xyFromCell(r2, Which(r2==1, cells=TRUE))
head(maxXY)
# x y
# [1,] 8 10
# [2,] 10 10
# [3,] 3 9
# [4,] 4 9
# [5,] 1 8
# [6,] 6 8

# Visually inspect the data and the calculated local maxima
plot(r) ## Plot of heights
windows() ## Open a second plotting device
plot(r2) ## Plot showing local maxima

关于r - 给定 R 中的二维数字 "height map"矩阵,如何找到所有局部最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com