Matlab:创建一个逐块排列

时间:2017-03-03 17:01:39

标签: arrays matlab unique permutation

我有一个从1到40的向量,并希望以这样的方式对其进行混洗:每个四个整数的块(总共十个块)只能自己进行洗牌。

例如:3 4 2 1 | 7 6 5 8 | 9 11 10 12 | ...

我最初的想法是将十个排列向量附加到彼此,然后在大排列向量中添加1到40个向量,但它根本没有按预期工作,并且在逻辑上是错误的。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

data = 10:10:120;    % input: values to be permuted
group_size = 4;      % input: group size
D = reshape(data, group_size, []);                            % step 1
[~, ind] = sort(rand(size(D)), 1);                            % step 2
result = D(bsxfun(@plus, ind, (0:size(D,2)-1)*group_size));   % step 3
result = result(:).';                                         % step 4

示例结果:

result =
    20    10    30    40    60    50    70    80   110   100   120    90

如何运作

  1. 将数据向量重新整形为矩阵D,以便每个组都是一列。这是通过reshape完成的。
  2. 生成矩阵ind,其中每列包含相应列D的排列索引。这样做可以生成独立的,统一的随机值(rand),对每列进行排序,并获得排序的索引(sort的第二个输出)。
  3. ind作为列索引应用于D。这需要转换为线性索引,可以使用bsxfun(或使用sub2ind来完成,但这通常会更慢。)
  4. 重塑为矢量。

答案 1 :(得分:2)

您可以使用A = A(randperm(length(A)))来重新排列数组。

Octave的例子:

for i = 1:4:40
  v(i:i+3) = v(i:i+3)(randperm(4));
end