将Matlab矩阵分割成多个相等的部分

7
我有一个大小为64500x17的矩阵。它表示我必须使用它来找到kmeans的5个质心的检测文本特征。
我需要做的是:
  • 将此矩阵分成5个12900x17的矩阵
  • 找到平均值
  • 将这些连接成一个5x17矩阵,以输入到kmeans的起始参数中。
我知道如何做几乎所有的事情(例如catkmeans等),但我仅仅是在试图找到一种将矩阵分成5部分或求和/除以所需大小的方法。
除非绝对必要,否则由于效率问题,我被禁止过多地使用for循环。
我在其他问题中找不到任何相关的示例,如果已经回答了这个问题,请耐心等待。
4个回答

5
您可以使用mat2cell和这个一行代码。
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
repmat12900*ones(5,1) - Gunther Struyf

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

1
使用冒号表示法来获取第一个子矩阵:
A(1:12900,:)

那么

A(12901:12900*2,:)

等等。


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元素的第一维上计算平均值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接