2012-12-06 76 views
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]; 
+0

所以要置换块?列总是一样的吗?是否有可能有两个相同值的分离块?即'[x 1 1 x x 1 1 1 x x]'? –

+0

@GuntherStruyf我认为排列块是我想要做的。一般来说,列将始终是相同的,并且我们可以假设它们是第一次。块不会分开。 – nofunsally

回答

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 
+0

+1我正在考虑类似的事情。我认为你可以做得更简单一些。 – angainor

相关问题