Matlab:如何生成包含1和/或0的所有组合和排列的3x3矩阵集(具有一个约束)

Matlab:如何生成包含1和/或0的所有组合和排列的3x3矩阵集(具有一个约束),matlab,matrix,Matlab,Matrix,我想生成一组3x3矩阵,其中包含所有排列和1和/或0的组合(即,包括0矩阵和1矩阵),但有一个约束:如果任何行(如“a”)包含多个1项,则在其中一列中有1项的任何其他行(如“b”)也必须在另一列中包含1项(s) 其中行“a”包含一个1条目 我希望这是清楚的,如果有任何帮助,我将非常感激 谢谢 Harry下面的答案旨在迭代所有这些矩阵,并使用它们进行doStuff。如果要在内存中分配所有可能性,这可能不是最有效的方法 该方法基于这样一个事实,即给定范围内(此处为0到2^9)的二进制表示将枚举该范围

我想生成一组3x3矩阵,其中包含所有排列和1和/或0的组合(即,包括0矩阵和1矩阵),但有一个约束:如果任何行(如“a”)包含多个1项,则在其中一列中有1项的任何其他行(如“b”)也必须在另一列中包含1项(s) 其中行“a”包含一个1条目

我希望这是清楚的,如果有任何帮助,我将非常感激

谢谢


Harry

下面的答案旨在迭代所有这些矩阵,并使用它们进行
doStuff
。如果要在内存中分配所有可能性,这可能不是最有效的方法

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

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


我不确定我是否得到了它,但您是否在寻找列和最多为1的所有3x3二进制矩阵?描述您的需求、请某人为您编写代码或解释如何编写代码的问题与堆栈溢出无关。请确定有关编程的特定问题。包括尝试的解决方案,解释结果与期望结果的差异,以及您收到的任何错误消息。请阅读这一页,我不明白你施加的限制。你能添加一些例子吗?我只需要使用dec2bin创建一个长度为9的向量,并将其重塑为3x3x3。这是最近演示的,请看这里:谢谢,这正是我想要得到的!并为任何滥用论坛的行为向其他人道歉,我知道这是下一次。
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
...
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

...