2012-12-06 370 views
7

我有一個大小爲64500x17的矩陣。它表示檢測到的texton功能,我必須使用它來查找kmeans的5個質心。將matlab矩陣分成若干等份

我需要的是:

  • 分裂這個矩陣到5點12900x17矩陣
  • 找到辦法
  • 這些串聯成一個5x17矩陣加到飼料中的kmeans開始參數。

我知道該怎麼做幾乎一切(catkmeans等),但我只是想找到一個矩陣分成5個部分,或加/劃分成所需大小的方法。

我被禁止過度使用循環(由於效率),除非絕對必要。

我在其他問題找不到任何相關的例子,所以如果這個問題已經得到解答,請耐心等待。

回答

1

採取第一子矩陣使用冒號表示法:

A(1:12900,:) 

然後

A(12901:12900*2,:) 

等。

3

只需使用索引和存儲在細胞中提取的矩陣更容易處理:

joined_means = cell2mat(splitted_data_means); 

用或者只是爲了赫克 - 的 - 它:

data = rand(64500,17); 
Nsubsets = 5; 
Nsubsize = size(data,1)/Nsubsets; 

splitted_data = cell(Nsubsets ,1); 
splitted_data_means = cell(Nsubsets,1); 

for ii=1:Nsubsets 
    splitted_data{ii} = data((ii-1)*Nsubsize + (1:Nsubsize),:); 
    splitted_data_means{ii} = mean(splitted_data{ii}); 
end 

然後你可以加入這些手段單線:

joined_means = cell2mat(arrayfun(@(ii) mean(data((ii-1)*12900+(1:12900),:)),(1:5)','uni',false)); 

這將是更簡單的@ angainor的mat2cell

joined_means = cell2mat(cellfun(@mean,mat2cell(data, 12900*ones(5,1), 17),'uni',false)); 
5

您可以使用mat2cell這oneliner

C = mat2cell(A, repmat(12900, 5, 1), 17); 

mat2cell第二個參數是矩陣的行分割。

現在C是一個單元陣列:

C = 

[12900x17 double] 
[12900x17 double] 
[12900x17 double] 
[12900x17 double] 
[12900x17 double] 

和部分矩陣可以作爲

C{1} etc. 
+1

'repmat'或'12900 * ones(5,1)' –

1

的可能最快的溶液是被訪問:

data = rand(64500,17); 
Nsubsets = 5; 
Nsubsize = size(data,1)/Nsubsets; 
joined_means=squeeze(mean(reshape(data,Nsubsize,Nsubsets,size(data,2)),1)); 

分割所述第一和那麼您可以計算Nsubsets ele的第一維上的平均值每個。