生成5个二进制数的所有可能组合,使得和小于或等于3

时间:2013-11-29 08:02:45

标签: algorithm matlab

如何在Matlab中生成一个有5行和一些特定列数的矩阵,这些元素可能只是二进制数,且列总和必须小于或等于3?

3 个答案:

答案 0 :(得分:1)

这个怎么样:你可以用5比特表示的最大二进制数是2 ^ 5-1 = 31并跳过它们来找到数字总和<= 3的那些。 像

这样的东西
n = 1:1:31;
for ii = 1:length(ii)
    bin = dec2bin(ii)
    digitSum = 0
    for d = 1:length(bin)
        digitSum = digitSum + str2num(bin(d))
    end
    if (digitSum <= 3)
        %store results
    end
end

答案 1 :(得分:1)

一些没有循环的可能性:

  1. 使用字符串:

    D = 5;
    S = 3;
    numbers = str2mat(dec2bin(0:2^D-1))-'0';
    numbers = numbers(sum(numbers,2)<=S,:);
    
  2. 使用组合数字,一行:

    numbers = [zeros(1,D); cell2mat(arrayfun(@(s) fliplr(full(sparse((1:nchoosek(D,s)).'*ones(1,s), nchoosek(1:D,s), 1))), 0:S, 'uni', 0).')];
    

答案 2 :(得分:0)

这是一个有效提供所有事件的复制解决方案:

Bstr =dec2bin(1:31); 
Bstr(sum(dec2bin(0:31),2)<=sum('00111'),:)=='1'

受@pyStarter

解决方案的启发