我有一个大小为64500x17
的矩阵。它表示检测到的texton功能,我必须使用它来查找kmeans
的5个质心。
我需要的是:
12900x17
矩阵5x17
矩阵,以输入kmeans
的起始参数。我知道如何做几乎所有事情(cat
,kmeans
等),但我只是想找到一种方法将矩阵分成5个部分,或者求和/分成所需的大小
除非绝对必要,否则我禁止过度使用循环(由于效率)。
我在其他问题中找不到任何相关的例子,所以如果已经回答,请耐心等待。
答案 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));
拆分第一维和第二维,然后您可以计算每个子集元素第一维的平均值。