Matlab - 根据这些组对某些点进行分组和排序

时间:2017-07-20 14:17:22

标签: matlab sorting

我得到了一个水平边缘点矩阵。我想要做的是组合这些边缘点,并尽可能找到它们之间的距离。

假设,下面的矩阵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)进行排序不会将点组合在一起。我该怎么用?

1 个答案:

答案 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