我想编写一个循环,用k 1和n-k 0扫描长度为n的所有二进制序列。
实际上,在每次迭代中,对序列执行一个动作,如果满足一个标准,则循环将中断,否则它将进入下一个序列。 (我不是在寻找nchoosek
或perms
,因为对于大的n值,需要花费很多时间来提供输出。
您建议使用哪种MATLAB代码?
答案 0 :(得分:2)
您可以实施类似iterator / generator模式的内容:
classdef Iterator < handle
properties (SetAccess = private)
n % sequence length
counter % keeps track of current iteration
end
methods
function obj = Iterator(n)
% constructor
obj.n = n;
obj.counter = 0;
end
function seq = next(obj)
% get next bit sequence
if (obj.counter > 2^(obj.n) - 1)
error('Iterator:StopIteration', 'Stop iteration')
end
seq = dec2bin(obj.counter, obj.n) - '0';
obj.counter = obj.counter + 1;
end
function tf = hasNext(obj)
% check if sequence still not ended
tf = (obj.counter <= 2^(obj.n) - 1);
end
function reset(obj)
% reset the iterator
obj.counter = 0;
end
end
end
现在您可以将其用作:
k = 2;
iter = Iterator(4);
while iter.hasNext()
seq = iter.next();
if sum(seq)~=k, continue, end
disp(seq)
end
在上面的例子中,这将遍历所有长度为4的0/1序列,其中k = 2个:
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0