爲簡單起見,如果我點的載體,它看起來像:查找集合N的距離相等的點
x = c(1,4,5,8,9)
我試圖找到n
點,這是彼此等距。在這種情況下我n=3
所以我理想的答案是:
1,5,9
由於5-1=4
和9-5=4
。
實際向量要大得多/複雜以及n
。 關於如何實現這一點的任何想法?
在此先感謝!
爲簡單起見,如果我點的載體,它看起來像:查找集合N的距離相等的點
x = c(1,4,5,8,9)
我試圖找到n
點,這是彼此等距。在這種情況下我n=3
所以我理想的答案是:
1,5,9
由於5-1=4
和9-5=4
。
實際向量要大得多/複雜以及n
。 關於如何實現這一點的任何想法?
在此先感謝!
這不是整個解決方案,但我認爲這是一個開始。首先,計算距離矩陣可能會有所幫助。
> 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
函數所標識的所有點組,超過你選擇的尺寸,然後檢查連通性。
PS在這裏有一個[很好的答案](http://stackoverflow.com/a/17191756/834521)關於如何從距離矩陣中的索引返回到(行,列) – TooTone
與上面的評論一致,這可能是你想要的東西,不一定是你所要求的。不過,我確信有一種更有效的方法可以做到這一點。
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
說實話,我不明白爲什麼'1,5,9'是等距的。如果該點與該集合中的每個對象之間的距離相等,則稱該點與一組對象等距。 – storaged
爲什麼「最有可能」是等距的?等距離不是真或假,對吧?如果集合中任意兩點之間的距離是相同的實數,則集合是等距的。在你的例子中,由於| 5-1 |,1,5,9並不等距!= | 9-1 |。 –
似乎可能有幾個長度爲n的向量是等距的,特別是如果length(x)很大,而n很小。 – rbatt