从矩阵中提取聚类

时间:2018-08-15 12:51:46

标签: matlab

假设我有一个矩阵,其中第一列和第二列分别代表x,y坐标,第三列是簇ID:

95.0129    5.7891    3.0000
23.1139   35.2868    1.0000
60.6843   81.3166    2.0000
48.5982    0.9861    3.0000
89.1299   13.8891    3.0000
76.2097   20.2765    3.0000
45.6468   19.8722    3.0000
 1.8504   60.3792    1.0000
82.1407   27.2188    3.0000
44.4703   19.8814    3.0000
61.5432    1.5274    3.0000
79.1937   74.6786    2.0000
92.1813   44.5096    2.0000
73.8207   93.1815    2.0000
17.6266   46.5994    1.0000
40.5706   41.8649    1.0000
93.5470   84.6221    2.0000
91.6904   52.5152    2.0000
41.0270   20.2647    3.0000
89.3650   67.2137    2.0000

我想使用MATLAB创建带有x,y坐标的单个群集ID的矩阵,例如群集1:c(1)= [23.1139 35.2868; 1.8504 60.3792; 17.6266 46.5994; 40.5706 41.8649]

2 个答案:

答案 0 :(得分:1)

我会扩展Cris的答案。您可以使用arrayfun一次自动创建所有集群:

C = arrayfun(@(id) A(A(:,3)==id, 1:2), unique(A(:,3)), 'UniformOutput', false)

这将为每个群集创建一个单元阵列。

正如与Cris讨论的那样,如果您跳过了集群ID,或者类似的事情您可以将它们存储在地图中,则可能会发生这种情况:

cluster_ids = unique(A(:,3));
cluster_map = containers.Map(cluster_ids, arrayfun(@(id) A(A(:,3)==id, 1:2), cluster_ids, 'UniformOutput', false));

然后使用ID cluster_map(3)

进行访问

答案 1 :(得分:0)

给定矩阵,将其命名为A,您可以执行以下操作:

>> A(A(:,3)==1,1:2)
ans =

   23.1139   35.2868
    1.8504   60.3792
   17.6266   46.5994
   40.5706   41.8649

A(:,3)==1是一个逻辑列向量,对于A(:,3)等于1(即群集ID 1)的行是正确的。接下来,我们用A(x,1:2)为逻辑列向量索引x,选择行,然后1:2选择列。