MATLAB:我想找出如何生成矩阵的所有可能组合(N乘M),其中: - 元素是" 1"和" 0"。 - 应该只有一个" 1"在每一栏中。 - 对行没有限制。所以多个" 1"允许在每一行内。
一个可能的状态,例如N = 5,M = 61 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
.
.
(以穷举搜索的方式)
答案 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