方法一:
从集合[0 1] 中生成m+n 元素的所有“组合”。这可以使用this approach 有效地完成。
只保留那些包含n 的组合。
代码:
m = 7; %// number of zeros
n = 9; %// number of ones
L = m+n;
vectors = repmat({[0 1]}, 1, L);
combs = cell(1,L);
[combs{end:-1:1}] = ndgrid(vectors{end:-1:1});
combs = cat(L+1, combs{:});
combs = reshape(combs,[],L);
combs = combs(sum(combs,2)==n,:);
m=2; n=3 的示例结果:
combs =
0 0 1 1 1
0 1 0 1 1
0 1 1 0 1
0 1 1 1 0
1 0 0 1 1
1 0 1 0 1
1 0 1 1 0
1 1 0 0 1
1 1 0 1 0
1 1 1 0 0
方法 1 已修改
要节省内存,请在第 1 步中使用 uint8 值,并在第 2 步结束时转换为 double:
m = 7; %// number of zeros
n = 9; %// number of ones
L = m+n;
vectors = repmat({uint8([0 1])}, 1, L);
combs = cell(1,L);
[combs{end:-1:1}] = ndgrid(vectors{end:-1:1});
combs = cat(L+1, combs{:});
combs = reshape(combs,[],L);
combs = double(combs(sum(combs,2)==n,:));
方法2:
类似于方法 1,但在步骤 1 中,使用 dec2bin 将所有组合生成为从 0 到 2^(m+n)-1 的所有整数的二进制表达式。这会产生一个char 数组,因此它应该与修改方法 1 一样具有内存效率。那么,第2步应该稍微适应一下使用chars,最后需要转换成数值:
m = 7; %// number of zeros
n = 9; %// number of ones
combs = dec2bin(0:2^(m+n)-1);
combs = combs(sum(combs=='1',2)==n,:)-'0';