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

时间:2015-01-03 21:43:53

标签: arrays matlab matrix

MATLAB:我想找出如何生成矩阵的所有可能组合(N乘M),其中: - 元素是" 1"和" 0"。 - 应该只有一个" 1"在每一栏中。 - 对行没有限制。所以多个" 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
  .
.

(以穷举搜索的方式)

1 个答案:

答案 0 :(得分:2)

会有批次。通常当这里的问题涉及:如何生成所有可能的 X ,真正的答案是:不要这样做,有太多可能<强> X 即可。寻找解决问题的不同方法。

尽管如此,您可以在行数的基础上使用数字表示:

使用方法:dec2base

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

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