2

同じ値を持つ行を互いに隣接させたまま、行をランダムに並べ替えるにはどうすればよいですか? 行で使用randpermしてすべての行をランダムに並べ替えることができることは知っていますが、同じ値の行を隣接させておく方法がわかりません。ありがとう。

A = [0 0 0;
     0 0 0;
     1 1 1;
     1 1 1;
     1 1 1;
     2 2 2;
     2 2 2];   

 permute_A = [0 0 0;
     0 0 0;
     2 2 2;
     2 2 2;
     1 1 1;
     1 1 1;
     1 1 1];
4

1 に答える 1

3

クラスターを特定してから、それらを並べ替える必要があります。

クラスターを見つけるには、それらの違いの変化を見つけることで実行できます。

diffA = diff(A);
clusters_start = [1 ; find(any(diffA,2)~=0)+1];

次に、クラスターの端は次の方法で簡単に見つかります。

clusters_end = [clusters_start(2:end)-1 ;size(A,1)];
clusters_length = clusters_end-clusters_start+1;

これで、クラスターの数がわかったので、それらを並べ替えることができます。

Nclusters = numel(clusters_start);
perm_idx = randperm(Nclusters );
clusters_start = clusters_start(perm_idx);
clusters_end = clusters_end(perm_idx);
clusters_length = clusters_length(perm_idx);

それらを新しいマトリックスに入れます:

newA = NaN(size(A));
for ii=1:Nclusters
    newA(sum(clusters_length(1:ii-1))+(1:clusters_length(ii)),:) = A(clusters_start(ii):clusters_end(ii),:);
end
于 2012-12-06T17:45:15.463 に答える