matlab - 随机排列矩阵行,保持相同值的行相邻

标签 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];

最佳答案

您必须识别簇,然后对它们进行排列:

可以通过查找差异的变化来找到簇:

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/

相关文章:

matlab - 如何将监听器设置为 MATLAB 对象的结构字段

string - 拆分由给定对象类型分隔的字符串

c++ - 由字符串而不是整数值索引的矩阵

c++ - 如何删除此代码的重复排列?

c - 在 C 中查找长度递增的数字列表的排列

c# - C# 中的置换算法

matlab - 是否可以在不将单元格加载到内存的情况下将数据添加到 matlab 单元格中?

linux - 如何告诉 mex 链接到/usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的那个?

R - 致力于速度/效率 - 从大文件创建+更新矩阵

c++ - OpenCV - float 据类型和强度范围在 0-255 内的 RGB channel