2012-06-15 2 views
2

나는 음수가 아닌 R 행렬을 가지고 있습니다. 행렬은 실제로 2D 높이 맵이며이 행렬에서 모든 로컬 최대 값을 찾고 싶습니다. 인접 요소가 서로 같은 (그리고 그것들이 총체적으로 최대치 인) "평탄한"봉우리의 경우, 각 "평평한"영역 내에서 적어도 하나의 좌표를 얻는 한 어떤 일이 일어나 든 상관 없습니다.R에 2D 숫자 "높이 맵"행렬이 주어지면 모든 로컬 최대 값을 어떻게 찾을 수 있습니까?

효율적으로 수행 할 수있는 기능이 있습니까? 분명히 루프를 수동으로 작성하여 모든 요소를 ​​개별적으로 테스트 할 수 있지만 R에서 수행하는 것은 매우 느립니다. 매트릭스 당 평균 약 884 개의 요소로 약 백만 개의 매트릭스에 대해이 작업을 수행해야합니다.

행렬을 입력으로 사용하고 열 1이 행 좌표이고 열 2가 열 좌표이며 행렬의 각 최대 값에 대해 하나의 행을 갖는 함수가있는 것이 이상적입니다.

행렬의 가장자리에있는 로컬 최대 값이 허용됩니다. 행렬 외부의 영역은 높이가 0 인 것으로 처리 될 수 있습니다.

재현 예 행렬 사용 :

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

집합적인 로컬 최대 값을 정의 할 때 두 개의 대각선으로 만지는 요소가 "이웃"으로 계산됩니까? 또한 사람들이 작업 할 수있는 비교적 단순한 (예 : 10x10 매트릭스) 구조를 만들 수 있습니까? –

+0

대각선 요소의 경우, 이웃으로 간주되는지 여부는 실제로 신경 쓰지 않습니다. 왜냐하면 2 개 (또는 그 이상)의 등가 치 로컬 최대 점이 경부 이웃이므로, 적어도 내가 얻은만큼 행복합니다 * 그들 중 하나. 나는 간단한 예제 행렬을 추가하여 작동하지 않을 것이다. –

답변

8

raster 패키지의 기능 focal() 이런 계산을 위해 설계된다. 다음 코드는 좌표를 모두 로컬 최대 값을 반환합니다. 여기에는 가장자리의 값과 "평원"의 일부가 포함됩니다.

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 
+0

멋진 도구 인 것 같습니다. 나는 실제로 각각의 최대치를 중심으로 "이웃"에서 다른 분석을하고 싶다. (나는 각자의 "최고점"을 정량화하고 싶다.) 그래서 모든 이웃에 어떤 함수를 적용 할 수있는 능력이 내가 원하는 것이다. –

+0

'focal'는 이제이 경우가'matrix (1,3,3)'이어야한다고 생각하는 가중치 행렬 w를 필요로합니다 ... – Spacedman

+0

@Spacedman 실제로. 이 답변을 curating 도움을 주셔서 감사합니다. –

관련 문제