4

非負の数値を持つR行列があります。行列は事実上2D高さマップであり、この行列内のすべての極大値を見つけたいと思います。隣接する要素が互いに等しい(そしてそれらは集合的に極大である)「フラット」ピークの場合、各「フラット」領域内で少なくとも1つの座標を取得する限り、何が起こるかは気になりません。

これを効率的に行うための機能はありますか?明らかに、ループを手動で記述して、すべての要素を個別に調べてテストすることもできますが、Rでそれを行うと非常に時間がかかります。これを約100万のマトリックスに対して行う必要があり、マトリックスあたりの平均要素数は約884です。

理想的には、行列を入力として受け取り、2列の行列を返す関数があります。列1は行の座標、列2は列の座標、行列の極大値ごとに1つの行です。

行列のエッジの極大値が許可されます。マトリックスの外側の領域は、高さがゼロとして扱うことができます。

使用する再現可能なサンプルマトリックス:

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

1 に答える 1

13

パッケージ内の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
于 2012-06-15T23:43:39.907 に答える