7

size の行列があります64500x17。の 5 つの重心を見つけるために使用しなければならない、検出された texton 機能を表しますkmeans

私が必要とするのは:

  • 12900x17この行列を 5 つの行列に分割します
  • 手段を見つける
  • 5x17これらを行列に連結して、 の開始パラメータに入力しkmeansます。

私はほとんどすべて ( 、 など) を行う方法を知っていますcatkmeans、マトリックスを 5 つの部分に分割する方法、または目的のサイズに合計/分割する方法を見つけようとしているだけです。

絶対に必要な場合を除き、(効率のために) for ループを過度に使用することは禁じられています。

他の質問に適切な例が見つからないので、これが回答されている場合は、ご容赦ください。

4

4 に答える 4

5

mat2cellこのワンライナーを使用できます

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

の 2 番目のパラメーター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

おそらく最速の解決策は次のとおりです。

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

最初の次元と 2 番目の次元を分割すると、それぞれ Nsubsets 要素の最初の次元の平均を計算できます。

于 2014-03-13T10:36:22.497 に答える
1

最初の部分行列を取得するには、コロン表記を使用します。

A(1:12900,:)

それから

A(12901:12900*2,:)

等々。

于 2012-12-06T21:17:56.953 に答える