如何随机排列行以使具有相同值的行彼此相邻?我知道我可以在行上使用 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];
最佳答案
您必须识别簇,然后对它们进行排列:
可以通过查找差异的变化来找到簇:
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
关于matlab - 随机排列矩阵行,保持相同值的行相邻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13748423/