2013-04-18 2 views
3

이 사이트는 새로운 기능입니다. 누구든지 그리드 좌표 (df로 아래의 예제 코드에서 볼 수 있음) 목록을 돌려 본 경험이 있는지 궁금합니다. 아주 작은 데이터 세트에 대한 작업을 처리 할 수있는 함수를 작성했지만 데이터 세트의 크기가 커질수록 실행 시간이 기하 급수적으로 늘어납니다 (800 픽셀은 약 25 시간이 걸릴 것이라고 생각합니다). 중첩 된 for 루프 때문에 발생하지만 주위를 둘러 볼 방법을 모르겠습니다.R의 그리드 좌표에서 인접성 행렬을 만드는 방법?

## Dummy Data 
x <- c(1,1,2,2,2,3,3) 
y <- c(3,4,2,3,4,1,2) 
df <- as.data.frame(cbind(x,y)) 
df 

## Here's what it looks like as an image 
a <- c(NA,NA,1,1) 
b <- c(NA,1,1,1) 
c <- c(1,1,NA,NA) 
image <- cbind(a,b,c) 
f <- function(m) t(m)[,nrow(m):1] 
image(f(image)) 

## Here's my adjacency matrix function that's slowwwwww 
adjacency.coordinates <- function(x,y) { 
    df <- as.data.frame(cbind(x,y)) 
    colnames(df) = c("V1","V2") 
    df <- df[with(df,order(V1,V2)),] 
    adj.mat <- diag(1,dim(df)[1]) 
    for (i in 1:dim(df)[1]) { 
    for (j in 1:dim(df)[1]) { 
     if((df[i,1]-df[j,1]==0)&(abs(df[i,2]-df[j,2])==1) | (df[i,2]-df[j,2]==0)&(abs(df[i,1]-df[j,1])==1)) { 
     adj.mat[i,j] = 1 
     } 
    } 
    } 
    return(adj.mat) 
} 

## Here's the adjacency matrix 
adjacency.coordinates(x,y) 

누구든지 몇 천 픽셀 길이의 좌표 세트에서 잘 작동하는 방법을 알고 있습니까? 나는 SpatialGridDataFrame으로 변환을 시도하고 거기에서 갔지만 인접성 행렬을 올바르게 얻지는 못한다. 시간 내 주셔서 대단히 감사합니다.

result <- apply(df, 1, function(pt) 
    (pt["x"] == df$x & abs(pt["y"] - df$y) == 1) | 
    (abs(pt["x"] - df$x) == 1 & pt["y"] == df$y)  
) 
diag(result) <- 1 

을 그리고 같은 대한 결과 loopiness를 방지하고 얻을 :

+2

을 OP는 분명히 adjacency 행렬 의 정점이 이미지의 "on"픽셀 인 것을 원합니다 ('x'와'y'는 픽셀 좌표이고 예제에서는 7 픽셀입니다), 두 개 사이의 모서리를 가진 그들이 이웃이라면 픽셀 . 2 차원 눈금의 하위 그래프입니다. ( 이미지는 다음과 같이 복제 할 수 있습니다. –

답변

4

내가 igraph 여기에 갈 수있는 방법이있을 거라고 생각하지만, 나는 당신이 그것을 할 수 있다고 생각보다 간단하게 좋아

> identical(adjacency.coordinates(x,y),result) 
[1] TRUE 
+0

그러나 결과 행렬은 (i, j, 'adjacency.coordinates (x, y)'의 원하는 출력과 같습니다. ... – Ben

+0

@Ben - op의'image' 호출을 복제하고,'adjacency matrix'를 생성합니다 위키피디아 정의. 솔직하게 말해서'adjacency.coordinates (x, y) '함수의 결과가 무엇을 의미하는지 혼란 스럽습니다. – thelatemail

+0

+1 동의, 나도 그 중 하나를 해결할 수 없습니다. – Ben

관련 문제