MATLAB:生成二进制矩阵的所有可能组合,每列中只有一个“1”

MATLAB: Generate all possible combination of a binary matrix with only one '1' in each column

MATLAB:我想了解如何生成矩阵(N 乘 M)的所有可能组合,其中: - 元素是“1”和“0”。 - 每列中应该只有一个“1”。 - 没有限制 rows.so 每行允许多个“1”。

一种可能的状态,例如N=5 , M=6

1 0 1 0 0 0
0 1 0 0 0 1
0 0 0 0 0 0
0 0 0 1 1 0
0 0 0 0 0 0

此外,我想生成每个可能的组合矩阵,然后像这样计算一些东西(例如我的问题中的效用函数):

generate one possible matrix C
.
  .
    for i=1:N
      for j=1:M
        do something on C(:,:)
      end
    end
  .
.

(穷举法)

会有。通常这里的问题涉及到:How do I generate all possible X,真正的答案是:Don't do it , 可能的 X 太多了。寻找解决问题的不同方法。

不过,您可以在行数的基础上使用数字表示法:

方法使用:dec2base

免责声明:由于 dec2base 的限制,这仅适用于 2<=rows<=36(希望足够了。否则我们将复制编辑文件 dec2base.m 并删除它的最后两个行和错误检查行 24 以实现 2<=rows 的任意值。出于版权原因,我不会 post 这段代码。)。

rows = 5; 
cols = 6;
assert((2<=rows)&&(rows<=36),'The dec2base-approach will only work for 2<=rows<=36');
symbols = dec2base(0:rows-1, rows, 1);
for ii = 0:rows^cols-1
    % Compute ii in base rows.
    iibR = dec2base(ii, rows, cols);
    C = bsxfun(@eq, symbols, iibR);
    disp(C);
end

生成没有 dec2base 的元组:

我们还可以使用 ndgrid.

生成这些代表我们数字的元组
%%// Data
rows = 3;
cols = 4;
%%// Compute all k-tuples of numbers 1:n
n = rows;
k = cols;
Cs = cell(1,k);
[Cs{:}] = ndgrid(1:n);
tuples = reshape(cat(n+1, Cs{:}),n^k,[]);
%%// Compute matrices
for ii = 1:size(tuples,1);
    C = bsxfun(@eq, (1:rows).', tuples(ii,:));
    disp(C);
end