首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找n个等距点的集合

寻找n个等距点的集合
EN

Stack Overflow用户
提问于 2013-06-19 05:13:22
回答 2查看 404关注 0票数 0

为了简单起见,如果我有一个点的向量,如下所示:

代码语言:javascript
复制
x = c(1,4,5,8,9)

我试着找出彼此距离相等的n点。在本例中是我的n=3,所以我的理想答案是:

1,5,9

5-1=49-5=4开始。

实际的向量要比n大得多/复杂得多。关于如何实现这一点有什么想法吗?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-19 20:40:18

这不是解决方案的全部,但我认为这是一个解决方案的开始。首先,计算距离矩阵可能会有所帮助。

代码语言:javascript
复制
> 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

其次,您可以通过对距离进行排序并对其进行游程编码来识别相距相同的点。

代码语言:javascript
复制
> 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的点--为例

代码语言:javascript
复制
> 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点之间的距离。但是你仍然需要做更多的工作来消除第二个和第四个点。想必你选择第一、第三和第五点是因为它们是相连的吧?

我认为您可能希望将rle函数标识的所有点处理为超出您选择的大小,然后检查连接性。

票数 1
EN

Stack Overflow用户

发布于 2013-06-19 18:32:13

与上面的评论一致,这里的一些东西可能是你想要的,而不一定是你所要求的。不过,我相信有一种更有效的方法可以做到这一点。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17179047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档