我得到了一个水平边缘点矩阵。我想要做的是组合这些边缘点,并尽可能找到它们之间的距离。
假设,下面的矩阵M表示xy坐标平面上的边缘点。
M=[15 1
16 1
19 1
21 1
17 2
18 2
94 2
98 2
20 3
95 3
97 3
96 4
16 20
18 20
21 20
17 21
19 22
20 23];
我想要做的是以分段方式组合更接近的点并获得下面的矩阵:
M=[15 1
16 1
17 2
18 2
19 1
20 3
21 1
16 20
17 21
18 20
19 22
20 23
21 20
94 2
95 3
96 4
97 3
98 2];
表示彼此接近的点一起显示。使用M = sortrows(M,1)或M = sortrows(M,2)进行排序不会将点组合在一起。我该怎么用?
答案 0 :(得分:1)
这是一个群集问题,而不是排序问题。尝试使用kmeans
(执行 k -means群集,这是一种众所周知的方法,可以找到靠近的数据组)。
如果您有MATLAB Statistics和机器学习工具箱,请使用内置的kmeans功能(运行ver
查看已安装的工具箱)。您必须指定群集的数量。对于像您发布的那样的简单数据集,通过查看散点图(scatter(M(:,1), M(:,2))
)可以很容易地做到这一点。
运行 k - 意味着聚类,它输出一个包含每个点所属的聚类的向量:
clusters = kmeans(M, 3)
将此列添加为该列排序的M
的第三列。第3列现在表示每个点所在的集群(例如,第三列中1
的所有点都是一个组)。
M(:,3) = clusters
groupedData = sortrows(M, 3)
16 20 1
18 20 1
21 20 1
17 21 1
19 22 1
20 23 1
94 2 2
98 2 2
95 3 2
97 3 2
96 4 2
15 1 3
16 1 3
19 1 3
21 1 3
17 2 3
18 2 3
20 3 3
然后,您可以使用逻辑索引选择单个组中的点:
M(M(:,3) == 1, :)
16 20 1
18 20 1
21 20 1
17 21 1
19 22 1
20 23 1
如果您没有MATLAB Statistics和Machine Learning Toolbox软件包,FileExchange中的此文件可能是一个很好的替代品:Kmeans Clustering by Mo Chen