2010-05-30 70 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); 

這與列名和每一行具有簇索引和一組座標創建一個表。