假设我有一个矩阵,其中第一列和第二列分别代表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]
。
答案 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
选择列。