从矩阵中提取数据点并将它们保存在MATLAB中的不同矩阵中

时间:2010-05-30 13:20:49

标签: matlab matrix

我有一个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保存在一个单独的矩阵中,等等...... 我可以手动完成它们,但问题是这必须是自动提取。这意味着簇的数量(簇阵列中的数字范围在每次运行中都不同)所以我必须有一个通用的算法来为我提取这个。有谁可以帮助我吗?感谢

5 个答案:

答案 0 :(得分:1)

我不是动态创建一堆矩阵,而是在一个单独的单元格中创建一个cell array,每个矩阵。这是使用函数SORTMAT2CELL

执行此操作的一种方法
[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);

这会创建一个包含列名的表,每行都有一个簇索引和一组坐标。