7

我有一个大小矩阵64500x17。它表示检测到的 texton 特征,我必须使用这些特征来为kmeans.

我需要的是:

  • 将此矩阵拆分为 5 个12900x17矩阵
  • 找到方法
  • 将这些连接成一个5x17矩阵以馈入 的起始参数kmeans

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

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

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

4

4 回答 4

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.
于 2012-12-06T21:28:43.730 回答
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's 会更简单mat2cell

joined_means = cell2mat(cellfun(@mean,mat2cell(data, 12900*ones(5,1), 17),'uni',false));
于 2012-12-06T21:24:06.840 回答
1

要获取第一个子矩阵,请使用冒号:

A(1:12900,:)

然后

A(12901:12900*2,:)

等等。

于 2012-12-06T21:17:56.953 回答
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 元素的第一维的平均值。

于 2014-03-13T10:36:22.497 回答