我遇到一个问题,我有一个集群中心列表和一个我必须得到最近集群的点列表。
例如:
nclusters = 10;
npoints = 100;
% Generate 10 random clusters in a 2D space
Clusters = rand(nclusters,2);
% Generate 100 random points in a 2D space
Points = rand(npoints,2);
% plot them
figure(1), hold on
plot(Clusters(:,1), Clusters(:,2), 'ro')
plot(Points(:,1), Points(:,2), 'bx')
现在我可以遍历每个点并计算哪个群集是最接近的群集:
ClusterIndexes = zeros(npoints,1)
for i = 1:npoints
% sum of squared differences (square root can be avoided)
SquareDist = sum(bsxfun(@minus, Clusters, Points(i,:)).^2, 2);
% Index of the closest cluster
[minVal minIdx] = min(SquareDist);
ClusterIndexes(i) = minIdx;
end
% plot results
figure(2), hold on
plot(Clusters(:,1), Clusters(:,2), 'ro')
plot(Points(:,1), Points(:,2), 'bx')
plot([Points(:,1) Clusters(ClusterIndexes,1)]', [Points(:,2) Clusters(ClusterIndexes,2)]', 'm-');
由于我使用bsxfun
,因此此代码有效并且效率很高。
但是,有没有更好的方法呢?也许摆脱循环?
我在考虑的情况是存在大量的点并且它们可能处于高维空间。
由于