来自预定义分组的点的组合,其最小化点之间的距离

时间:2016-06-17 14:36:40

标签: matlab

假设您有一个带有集群中心的矩阵,并且您希望将它们合并。例如,假设7个中心:

176 187 96
47  52  35
102 112 80
59  60  55
145 156 83
56  54  30
229 255 128

我有一个返回分组列表的函数。行是组,列是作为该组成员的原始数据行的索引。例如,让我们说:

     2     4
     1     5
     2     6
     4     6

这意味着第一组包含第2和第4点,第二组包含第1和第5点等。

对于每个分组,我将“分数”定义为该组中两个点之间的距离。我还将聚类中心定义为组内两个点的平均值。

我想以矢量化的方式确定点之间距离最小的分组以及该组的中心。

1 个答案:

答案 0 :(得分:0)

要计算这些东西,我们可以先使用你的cluster数组创建一个3D数组,其中每个分组用一行表示,XYZ用列表示,第三个维度是两个分组。中心。

让我们创建原始数据:

orig = [176 187 96; 47  52  35; 102 112 80; 59  60  55; 145 156 83; 56  54  30; 229 255 128];
groups = [2 4; 1 5; 2 6; 4 6];

然后我们重塑它,以便成对沿着第三维排列

data = permute(reshape(orig(groups,:), size(groups,1), size(groups,2), []), [1 3 2]);

%   data(:,:,1) =
%       47    52    35
%      176   187    96
%       47    52    35
%       59    60    55
%   data(:,:,2) =
%       59    60    55
%      145   156    83
%       56    54    30
%       56    54    30

然后我们可以计算每组的平均值

centers = mean(data, 3);

%       53           56           45
%    160.5        171.5         89.5
%     51.5           53         32.5
%     57.5           57         42.5

我们可以找到每个组合的两个成员之间的距离

distances = sqrt(sum(diff(data, [], 3).^2, 2))

%   24.658
%   45.727
%   10.488
%   25.884

" best"一个是距离最小的那个

[mindist, best] = min(distances);
inds(best,:)

%   2   6