【问题标题】:Preventing repeated sequences in a matrix in Matlab防止Matlab中矩阵中的重复序列
【发布时间】:2012-09-21 01:24:27
【问题描述】:

我有一个 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

非常感谢任何 cmets。谢谢。

【问题讨论】:

  • 1) 在某些情况下,这是不可能的。例如,当所有 order(:,3) 都相等时。 2)你想让洗牌是随机的吗? 3) 是作业吗?
  • 感谢您的建议,不是作业,是实验。

标签: matlab constraints shuffle


【解决方案1】:

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

我会使用rejection sampling 进行改组。

伪代码是:

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

【讨论】:

  • 感谢您提供的信息。拒绝抽样!
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多