将matlab矩阵分成几个相等的部分

时间:2012-12-06 21:03:01

标签: matlab matrix k-means

我有一个大小为64500x17的矩阵。它表示检测到的texton功能,我必须使用它来查找kmeans的5个质心。

我需要的是:

  • 将此矩阵拆分为5个12900x17矩阵
  • 找到手段
  • 将这些内容连接到5x17矩阵,以输入kmeans的起始参数。

我知道如何做几乎所有事情(catkmeans等),但我只是想找到一种方法将矩阵分成5个部分,或者求和/分成所需的大小

除非绝对必要,否则我禁止过度使用循环(由于效率)。

我在其他问题中找不到任何相关的例子,所以如果已经回答,请耐心等待。

4 个答案:

答案 0 :(得分: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 :(得分:3)

只需使用索引并将提取的矩阵存储在单元格中以便于处理:

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(splitted_data_means);

或者仅仅是因为单行代码:

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));

答案 2 :(得分:1)

要使第一个子矩阵使用冒号:

A(1:12900,:)

然后

A(12901:12900*2,:)

等等。

答案 3 :(得分:1)

概率最快的解决方案是:

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

拆分第一维和第二维,然后您可以计算每个子集元素第一维的平均值。