2012-12-06 45 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