2013-06-18 55 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

爲什麼「最有可能」是等距的?等距離不是真或假,對吧?如果集合中任意兩點之間的距離是相同的實數,則集合是等距的。在你的例子中,由於| 5-1 |,1,5,9並不等距!= | 9-1 |。 –

+0

似乎可能有幾個長度爲n的向量是等距的,特別是如果length(x)很大,而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功能回到指數在原距離矩陣。以第三組 - 由距離4隔開的點 - 作爲示例

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

(指數從上到下依次從左至右)。因此,在這裏您已經確定了距離矩陣中的4 s:這些是x中第1/3,第2/4和第3/5個點之間的距離。但是你仍然需要做更多的工作來消除第二和第四點。大概你選擇第一,第三和第五點,因爲他們連接?

我想你會想處理rle函數所標識的所有點組,超過你選擇的尺寸,然後檢查連通性。

+0

PS在這裏有一個[很好的答案](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 
相關問題