【发布时间】:2014-04-04 21:36:10
【问题描述】:
我已经阅读了大量关于在集群周围绘制多边形的文章,并意识到 convhull 可能是最好的前进方式。基本上,我正在寻找一个类似弹性的多边形来环绕我的聚类点。
我的数据是由 x(第 1 列)和 y(第 2 列)点组成的矩阵,这些点按簇(第 3 列)分组。我有 700 个这样的集群,因此单独绘制每个集群是不可行的。
有没有办法分别为每个集群执行 convhull,然后将它们中的每一个绘制在一个图表上。
编辑
到目前为止,我编写的代码无法在每个单独的集群上运行凸包...
[ndata, text, alldata] = xlsread(fullfile(source_dir));
[~, y] = sort(ndata(:,end));
As = ndata(y,:);
lon = As(:,1);
lat = As(:,2);
cluster = As(:,3);
%% To find number of points in a cluster (repetitions)
rep = zeros(size(cluster));
for j = 1:length(cluster)
rep(j) = sum(cluster==cluster(j));
end
%% Less than 3 points in a cluster are filtered out
x = lon (rep>3);
y = lat (rep>3);
z = cluster (rep>3);
%% convex hull for each cluster plotted ....hold....then display all.
figure
hold on
clusters = unique(z);
for i = 1:length(z)
k=convhull(x(z==clusters(i)), y(z==clusters(i)));
plot(x, y, 'b.'); %# plot cluster points
plot(x(k),y(k),'r-'); %# plots only k indices, giving the convex hull
end
下面是正在显示的图像;
如果这个问题已经被问过,我很抱歉重复,但请引导我找到你认为合适的答案。
请任何人都可以帮助解决这个问题,但我真的很挣扎!
【问题讨论】:
-
如果将数据分成 700 组数据点(每个集群一组),似乎应该很简单。为每个集群运行凸包算法,然后绘制结果包。
-
@Nuclearman 绝对是,但我对 matlab 不是很好,无法实现它。我已经编写了一些代码,但它为整个数据集而不是组实现了凸包。不知道如何分别为每个集群实现它。编辑我的问题以添加我现在拥有的代码。
-
我想我应该预料到问题是缺乏熟悉。那是一个问题,因为我也不熟悉matlab(因此是评论而不是回答)。但是,您应该能够通过按集群对数据进行排序以按集群对数据进行分组。然后使用 for 循环遍历每个数据点并将其添加到该集群中的点列表中,直到集群发生变化。发生这种情况时,构建并绘制前一个集群列表的凸包,并创建一个新列表,其中当前点作为下一个集群列表的开始。只要确保你绘制了最后一个集群。
-
恭喜。 您即将编写您的第一个重要程序!它可以使用 for 循环 来实现!所以开始吧!
-
嘿@Anony-Mousse 我知道这不是一个复杂的问题,只是我无法实现它。如果您可以查看代码并提出解决方案,我将不胜感激。谢谢
标签: matlab polygon cluster-analysis convex-hull