对于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)';
有没有办法在没有大量循环迭代的情况下生成这些值?
答案 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');