为大X找到具有n个非零数字的X二进制数。 - Matlab

时间:2015-03-06 10:31:42

标签: matlab binary

对于1到N的范围,是否有更有效的方法来生成X二进制数(具有n个非零数字)?我开发了以下解决方案:

Totalcombos = nchoosek(N,n);                             
floor = floor(log2(Totalcombos));
L = 2.^floor;    
NumElem = 2^N-1;
i=0;
x=1;
%Creates Index combination LUT 
while 1
    %Produces Binary from 1 : NumElem
    binNum= de2bi(x,N,'right-msb')';
    x=x+1;
    %Finds number of bits in each binary number
    NumOfBits = sum(binNum);    
    %Creates a matrix of binary numbers from 1:NumElem with n 1's
    if NumOfBits == n
        i=i+1;
        ISmatrixShapes{i} = binNum(:,:);
    end
    if i==L
        break
    end
end
ISmatrixShape2=cell2mat(ISmatrixShapes);
ISmatrixShape=ISmatrixShape2(:,1:L)';

有没有办法在没有大量循环迭代的情况下生成这些值?

1 个答案:

答案 0 :(得分:3)

这会生成所有N位二进制数,其n个和N-n个零:

N = 5;
n = 3;
ind = nchoosek(1:N, n);
S = size(ind,1);
result = zeros(S,N);
result(bsxfun(@plus, (ind-1)*S, (1:S).')) = 1;

通过生成n个可能位置(N行)中nchoosek个位置的所有组合,然后使用线性1填充这些值来工作索引(bsxfun行)。

此示例中的结果是

result =
     1     1     1     0     0
     1     1     0     1     0
     1     1     0     0     1
     1     0     1     1     0
     1     0     1     0     1
     1     0     0     1     1
     0     1     1     1     0
     0     1     1     0     1
     0     1     0     1     1
     0     0     1     1     1

另一种效率较低的方法是生成包含n个和N-n个零的向量的所有排列,然后删除重复项:

result = unique(perms([ones(1,n) zeros(1,N-n)]), 'rows');