根据特定约束对矩阵进行排序和随机化

时间:2012-02-29 02:08:09

标签: matlab matrix

我有一个32 x 3矩阵如下:

A =

[1 1 1;

1 1 2;

1 1 3;

1 1 4;

1 1 5;

1 1 6;

1 1 7;

1 1 8;

1 2 1;

1 2 2;

1 2 3;

1 2 4;

1 2 5;

1 2 6;

1 2 7;

1 2 8;

2 1 1;

2 1 2;

2 1 3;

2 1 4;

2 1 5;

2 1 6;

2 1 7;

2 1 8;

2 2 1;

2 2 2;

2 2 3;

2 2 4;

2 2 5;

2 2 6;

2 2 7;

2 2 8]

我需要做的是随机化行的顺序,同时保持行值在一起,但是,这需要被约束,使得对于A(:,4),每8行仅包含数字1 - 8例如,你可以有类似的东西:

A(1:8,:) =

[1 2 4;

1 1 5;

2 1 6;

1 1 8;

2 2 1;

2 1 2;

2 1 7;

1 1 3]

前两列中1和2的出现需要是随机的,1 - 8需要对第3列的每8个值进行随机化。最初我尝试在带有附加约束的循环中使用函数randswap,但这只会导致无限循环。同样重要的是行保持在一起,因为前两列中的1和2需要在最后一列旁边出现相同的次数。有人建议如下,但它没有完全解决..

  m = size(A,1);

  n = 1:8;

  out = 1;

  i2 = 1;

  while ~all(ismember(1:8,out)) && i2 < 100

   i1 = randperm(m);

   out = A(i1(n),:);

   i2 = i2 + 1;

  end

1 个答案:

答案 0 :(得分:1)

如果您只需要从A中获取一组8行,则可以构造如下结果:

out = [randi([1,2],[8,2]),randperm(8)']

out =
     2     1     5
     2     1     2
     2     1     1
     1     2     7
     2     2     6
     1     1     8
     2     2     3
     1     1     4

如果您需要随机化所有A,您可以执行以下操作:

%# calculate index for the 1's and 2's
r = rand(8,4);
[~,idx12] = sort(r,2);

%# calculate index for the 1's through 8's
[~,idx8] = sort(r,1);

%# use idx8 to shuffle idx12
idx8into12 = bsxfun(@plus,idx8,[0 8 16 24]);

%# now we can construct the output matrix
B = [1 1;1 2;2 1;2 2];
out = [B(idx12(idx8into12),:),idx8(:)];

out =
     1     1     7
     1     2     3
     1     2     1
     2     1     8
     2     1     5
     2     2     4
     2     2     2
     2     1     6
     1     1     3
     1     2     7
     1     1     1
     1     2     8
     1     2     4
     1     1     5
     2     2     6
     2     1     2
     1     1     8
     2     1     7
     1     2     5
     2     1     1
     1     2     6
     2     1     3
     1     1     2
     1     1     4
     2     1     4
     2     2     7
     2     2     8
     2     2     3
     1     2     2
     1     1     6
     2     2     5
     2     2     1

如果你unique(out,'rows'),你会看到确实有32个唯一的行。 out中的每8行在第三列中都有数字1到8。