随机置换矩阵行,使相同值的行保持相邻

时间:2012-12-06 16:45:33

标签: matlab matrix permutation

如何随机置换行,保持相邻值相邻的行?我知道我可以在行上使用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];

1 个答案:

答案 0 :(得分: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