2013-06-18 1 views
0

, 내가 좋아하는 뭔가 보이는 점의 벡터가있는 경우 :똑같이 N의 집합을 찾기 먼 지점 편의상

x = c(1,4,5,8,9) 

내가 서로 같은 거리에있는 n 점을 찾기 위해 노력하고 있습니다. 이 경우 내 n=3 나의 이상적인 대답은 다음과 같습니다

1,5,9-

5-1=49-5=4입니다.

실제 벡터는 훨씬 더 크고 복잡하며 n입니다. 어떻게하면이 아이디어를 얻을 수 있습니까? 사전에

감사합니다!

+2

솔직히 왜 '1,5,9'가 등거리입니까? 점은 그 점과 집합 내의 각 객체 사이의 거리가 같으면 객체 집합과 등거리에 있다고 말합니다. – storaged

+0

왜 "가장 가능성이 높습니다"등거리입니까? 등전위는 진실인가 거짓인가? 집합 내의 임의의 두 점 사이의 거리가 같은 실수 인 경우 집합은 등거리입니다. 귀하의 예제에서, 1,5,9는 등거리가 아닙니다. ! = | 9-1 |. –

+0

특히'length (x)'가 크고'n'이 작은 경우 길이가 'n'인 여러 벡터가 등거리가 될 수있는 것처럼 보입니다. – rbatt

답변

1

이것은 전체적인 해결책은 아니지만 나는 이것이 하나의 시작이라고 생각합니다. 첫째, 거리 매트릭스를 계산하는 것이 도움이 될 것입니다.

> x <- c(1,4,5,8,9) 
> dx <- dist(x) 
> dx 
    1 2 3 4 
2 3  
3 4 1  
4 7 4 3 
5 8 5 4 1 

둘째, 거리를 정렬하고 길이를 인코딩하여 동일한 거리만큼 떨어진 지점을 식별 할 수 있습니다.

> rdx <- rle(sort(dx)) 
> rdx 
Run Length Encoding 
    lengths: int [1:6] 2 2 3 1 1 1 
    values : num [1:6] 1 3 4 5 7 8 

당신이 원하는 지점 세트를 선택하고 다음 order 기능을 사용하여 원래 거리 매트릭스에 다시 인덱스를 얻을. 제 3 그룹 촬영 - 거리 (4)에 의해 분리 점으로 - 예

> i=3 
> orderedIndex <- sum(rdx$lengths[1:(i-1)]) 
> order(dx)[(orderedIndex+1):(orderedIndex+rdx$lengths[i])] 
[1] 2 6 9 

로 (인덱스는 왼쪽에서 오른쪽으로 아래로 그 위에서부터 카운트). 거리 매트릭스에서 4을 확인했습니다. x에서 1/3, 2/4, 3/5 포인트 사이의 거리입니다. 그러나 두 번째와 네 번째 점을 제거하기 위해 더 많은 작업을해야합니다. 아마 그들이 연결되어 있기 때문에 당신은 1, 3 및 5 포인트를 선택합니까?

rle 함수로 식별되는 모든 포인트 그룹을 선택한 크기 이상으로 처리 한 다음 연결을 확인하려고한다고 생각합니다.

+0

추신 : 거리 매트릭스의 인덱스에서 (행, 열)로 이동하는 방법에 관해서는 [여기 좋은 대답이 있습니다] (http://stackoverflow.com/a/17191756/834521) – TooTone

1

위의 설명과 일치하여 원하는 내용 일 수도 있고 반드시 필요한 내용 일 수도 있습니다. 그래도이 방법을 사용하는 것이 더 효율적이라고 확신합니다.

x = c(1,4,5,8,9) 
x2 <- as.matrix(expand.grid(x, x)) 
x2 <- as.data.frame(t(apply(x2, 1, sort))) 
x2 <- x2[!duplicated(x2), ] 
x2 <- cbind(x2, d =abs(mapply("-", x2[,1], x2[,2]))) 
x2[order(x2$d), ] 
# V1 V2 d 
# 1 1 1 0 
# 7 4 4 0 
# 13 5 5 0 
# 19 8 8 0 
# 25 9 9 0 
# 8 4 5 1 
# 20 8 9 1 
# 2 1 4 3 
# 14 5 8 3 
# 3 1 5 4 
# 9 4 8 4 
# 15 5 9 4 
# 10 4 9 5 
# 4 1 8 7 
# 5 1 9 8 
관련 문제