1

我有一个 192 x 3 矩阵,order(192 x 3):

order(:, 1) 和 order(:, 2) 都包含 1 - 16 的重复值,而 order(:, 3) 包含 1 和 2 的重复值。我需要打乱矩阵,同时防止更多的重复最后一列中的相同值超过三个,因此 order(:, 3) 不应显示超过 3 个重复的 1 或 2。

这就是我所拥有的,它适用于较小版本的矩阵就好了,但似乎卡住了一个稍大的矩阵:

not_good = true;

while not_good

    not_good = false;

    order = Shuffle(order);

    % returns an array of 1s and 0s indexing the position of the values for 1 and 2
    R1 = order(:, 3) == 1;
    R2 = order(:, 3) == 2;

    % checks for repeats, returns 1 if repeats are present
    rep_test1 = any(diff([1; find(R1)])>3);
    rep_test2 = any(diff([1; find(R2)])>3);

    if rep_test1 > 0 || rep_test2 > 0
        not_good = true;
    end
end

非常感谢任何评论。谢谢。

4

2 回答 2

1

鉴于您已经找到满足您条件的安排。但是应该可以构建这样的安排。

我会用拒绝抽样进行改组。

伪代码将是:

function shuffled = shuffle(orig)
for i=1:numShuffles
  [i1,i2] = randomIndices;
  tmp = shuffled with permuted lines i1 and i2 
  test if matrix is still valid
  if valid shuffled=tmp;
end
于 2012-09-21T08:39:15.890 回答
0

如果您对如何Shuffle,那么对其进行特定于问题的实现是最有效的。例如,制作一个立即拒绝无法解决的问题的版本,如果它等于它上面的两个条目,则拒绝循环内输出矩阵的任何新添加。

但是假设您没有这种级别的控制,那么我必须同意@Oli。您的代码没有固有缺陷,只是缺少检查问题是否完全可以解决。

不过,它确实有一个主要缺点。例如,如果

order(:,3).' = [1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 ...]

在 a 之后获得(超过)三个连续的机会Shuffle将非常大。这意味着循环必须运行很多次才能给出任何结果。不幸的是,如果问题是可以解决的,但在这种情况下只是“难以解决”,那么您无能为力,只能等待。

于 2012-09-21T08:36:22.920 回答