Matlab 从矩阵中提取聚类
假设我有一个矩阵,其中第一列和第二列表示x,y坐标,第三列表示集群ID:Matlab 从矩阵中提取聚类,matlab,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
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]
给定矩阵,让我们称它为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
选择列。我将扩展Cris的答案s.t。您可以使用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
集群地图(3)
访问它,请发布问题,这些问题可能对其他人有用,并且可能有一些历史价值。很好!我想补充一点:如果C{n}
必须是集群n
的坐标,那么使用1:max(A(:,3))
而不是unique(A(:,3))
。这是一个有效的注释。然而,我只是假设id都是给定/使用的。如果这不是小事,我想我会把它们放进一个容器里;当我考虑X时,Y坐标代表X中的节点的位置,Y-Prand和I假设每个簇中的节点基于重叠相关。我想计算相关系数,首先计算节点之间的欧氏距离,然后使用指数模型计算相关系数,例如c(1,1)=exp(-d(1,1)),然后我可以得到每个簇的矩阵。非常感谢。