2010-05-30 33 views
1

保存他们在不同的矩阵我有一个2D矩阵由一些坐标如下(实施例):数据(X,Y):从矩阵中提取的数据点和在MATLAB

45.987543423,5.35000964 
52.987544223,5,98765234 

另外我有一个阵列由一些整数> = 0的,例如:群集(M)

2,0,3,1 

每个此数组中的这些数字与我的2D矩阵above.For例的行对应,它说,一个行(坐标)在Data Matirx中属于集群2,第二行属于集群0等等。 现在我想让每个群集的每个数据点位于一个单独的矩阵中,例如我想将属于群集1的数据点保存在一个单独的矩阵中,群集2保存在一个单独的矩阵中,依此类推...... 可以手动完成它们,但问题是这必须是自动提取。这意味着群集的数量(群集数组的范围在每次运行中都不相同),所以我必须有一个通用算法来为我进行这种提取。有人能帮助我吗?感谢

+0

为什么这些集群必须在一个单独的矩阵?你能解释这个要求的基本原理吗? – physics90 2014-05-29 01:33:28

回答

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 
0

我想是这样的溶液:

数据(簇== I,:)

i哪里是群集的索引。您的索引矩阵转换为布尔矩阵,然后用于索引行,并将每个选定的行完全添加到结果矩阵中。

如果这不是你要找的,请更清楚地说明你的需求。

+0

谢谢,我想这是从基于簇矩阵的2-D矩阵中提取它们的解决方案。问题是群集的数量,换句话说,群集数组中的数字范围是未知的。并且在每次运行中它们都会有所不同。有时5,6,7,10,.....我必须找到一种方法,以便我可以动态地使用矩阵从DATA矩阵中提取数据给他们...... – Hossein 2010-05-30 13:47:24

+0

假设他们递增并且没有间隙地获取数字,请调用'最大'你的索引矢量。您可以通过这种方式遍历所有可能的索引值,在每个集群上执行所需的操作。 – Pieter 2010-05-30 14:15:34

+0

同意。但我想将它们保存在不同的矩阵中,我如何定义矩阵动态? – Hossein 2010-05-30 14:19:21

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中的第一项,

0

谢谢大家,我设法使之与此代码的工作坐标等:

noOfClusters = max(cluster); %without noise 
for i=1:noOfClusters 
C(i,1) = {numData(cluster==i,:)} 
end 

我假设你的代码更快,因为你不用循环。

+0

你的代码有几个问题:1)如果'0'是'class'中的一个值,它将被忽略。 2)你应该避免使用'class'作为变量名,因为它是MATLAB中的一个内置函数。 3)你并不需要使用变量'h'。您可以改用循环变量'i'。 – gnovice 2010-05-30 20:10:25

+0

噢,是的,谢谢,我没有注意到我会修复它,我也这样做,因为我没有群集0.但是再次感谢您的意见。 – Hossein 2010-05-30 20:17:56

0

我会创建一个3维数组或表格。这样,群集索引将与群集相关联。像下面的结构:

xData = Data(:,1); 
yData = Data(:,2); 

clusterTable = table(Cluster, xData, yData); 

这与列名和每一行具有簇索引和一组坐标创建一个表。