【问题标题】:Matlab: How to generate the set of 3x3 matrices containing all combinations and permutations of ones and/or zeroes (with one constraint) [closed]Matlab:如何生成一组 3x3 矩阵,其中包含 1 和/或 0 的所有组合和排列(有一个约束)[关闭]
【发布时间】:2014-04-19 00:26:39
【问题描述】:

我想生成一组 3x3 矩阵,其中包含一个和/或零的所有排列和组合(即包括零矩阵和一个矩阵),但有一个约束:如果有任何行(比如“a”)包含多个 1 条目,在这些列之一中具有 1 条目的任何其他行(例如“b”)也必须在“a”行包含 1 条目的其他列中包含 1 条目。

我希望这很清楚,并且非常感谢您提供任何帮助,

谢谢,

哈利

【问题讨论】:

  • 我不确定我是否得到它,但您是否正在寻找列总和最多为 1 的所有 3x3 二进制矩阵?
  • 描述您的要求并要求某人为您编写代码或解释如何编写代码的问题对于 Stack Overflow 来说是题外话。请确定有关编程的特定问题或问题。包括尝试的解决方案、结果与预期结果有何不同的解释,以及您收到的任何错误消息。请阅读About 页面和this advice on asking good questions
  • 我不明白你施加的约束。你能添加例子吗?
  • 我只需使用 dec2bin 创建一个长度为 9 的所有排列的向量并将其重塑为 3x3xN
  • 这是最近演示的,见这里:stackoverflow.com/questions/23116510/…

标签: matlab matrix


【解决方案1】:

以下答案旨在仅遍历所有此类矩阵和doStuff。如果您想在内存中分配所有可能性,这可能不是最有效的方法。

这种方法基于这样一个事实,即在给定范围(这里是从 0 到 2^9)中的二进制表示将枚举该范围内 0 和 1 的所有可能组合。

检查约束或多或少直接遵循您的描述,结果有点冗长:-)

enumerateMatrices(3)

% Function enumerateMatrices:
function result = enumerateMatrices(n)
    result = [];
    for i = 1:2^(n*n)
        array = dec2bin(i-1, n*n) - '0';
        matrix = reshape(array, n, n);
        if ~checkConstraint(matrix, n)
            continue;
        end
        result(:, :, end+1) = matrix; %#ok<AGROW>
        doStuff(matrix);
    end
end

function met = checkConstraint(matrix, n)
    met = true;
    for i=1:n
        countOnes = sum(matrix(i, :));
        if (countOnes <= 1)
            continue;
        end
        samePositions = matrix(:, matrix(i, :) == 1);
        sumSamePositions = sum(samePositions, 2);
        if ~all(sumSamePositions == 0 | sumSamePositions == countOnes)
            met = false;
        end
    end
end

function doStuff(matrix)
    matrix;
end

这会返回 512 个可能的结果中的 129 个,例如:

...
ans(:,:,122) =

     1     0     1
     1     0     1
     0     1     0


ans(:,:,123) =

     1     1     0
     1     1     0
     0     0     0


ans(:,:,124) =

     1     1     0
     1     1     0
     0     0     1


ans(:,:,125) =

     1     1     1
     1     1     1
     0     0     0

...

【讨论】:

  • 谢谢,正是我想要得到的!并为论坛的任何滥用向其他人道歉,我知道下次。
猜你喜欢
  • 2018-08-01
  • 2018-09-07
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
相关资源
最近更新 更多