我有一个2D矩阵,由下面的一些坐标组成(例子):数据(X,Y):
45.987543423,5.35000964
52.987544223,5,98765234
此外,我有一个由一些整数> = 0组成的数组,例如:Cluster(M)
2,0,3,1
这个数组中的每个数字都对应于我上面的2D Matrix的一行。例如,它表示Data Matirx中的第一行(坐标)属于集群2,第二行属于集群0,依此类推。 现在我想让每个簇的每个数据点都在一个单独的矩阵中,例如我想将属于簇1的数据点保存在一个单独的矩阵中,簇2保存在一个单独的矩阵中,等等...... 我可以手动完成它们,但问题是这必须是自动提取。这意味着簇的数量(簇阵列中的数字范围在每次运行中都不同)所以我必须有一个通用的算法来为我提取这个。有谁可以帮助我吗?感谢
答案 0 :(得分:1)
我不是动态创建一堆矩阵,而是在一个单独的单元格中创建一个cell array,每个矩阵。这是使用函数SORT和MAT2CELL:
执行此操作的一种方法[cluster,sortIndex] = sort(cluster); %# Sort cluster and get sorting index
data = data(sortIndex,:); %# Apply the same sorting to data
clusterCounts = diff([0 find(diff(cluster)) numel(cluster)]); %# Find size of
%# each cluster
cellArray = mat2cell(data,clusterCounts,2); %# Break up data into matrices,
%# each in a separate cell
答案 1 :(得分:1)
您可以使用ARRAYFUN在不同的单元格阵列之间分配坐标。
%# create sample data
clusterIdx = [2,0,3,1,1,1,3,2];
coordinates = rand(8,2);
%# first you get a list of unique cluster indices
clusterIdxUnique = unique(clusterIdx);
%# then you use arrayfun to distribute the coordinates
clusterCell = arrayfun(@(x)coordinates(clusterIdx==x,:),clusterIdxUnique,'UniformOutput',false);
clusterCell
的第一个元素包含与clusterIdxUnique
中的第一个条目对应的坐标等。
答案 2 :(得分:0)
我想这是解决方案:
数据(cluster == i,:)
其中i
是群集的索引。您的索引矩阵将转换为布尔矩阵,然后用于索引行,并将每个选定的行完全添加到结果矩阵中。
如果这不是您想要的,请更清楚地说明您的需求。
答案 3 :(得分:0)
谢谢大家,我设法使用此代码:
noOfClusters = max(cluster); %without noise
for i=1:noOfClusters
C(i,1) = {numData(cluster==i,:)}
end
我认为你的代码要快得多,因为你不使用for循环。
答案 4 :(得分:0)
我要么创建一个三维数组或表。这样,集群索引将与集群相关联。像下面的结构:
xData = Data(:,1);
yData = Data(:,2);
clusterTable = table(Cluster, xData, yData);
这会创建一个包含列名的表,每行都有一个簇索引和一组坐标。