2012-03-19 88 views
5

给定一个正整数n,我想在matlab中生成所有可能的n位组合。
对于例如:如果n = 3,那么答案应该是如何生成所有可能的组合的n位字符串?

000 
001 
010 
011 
100 
101 
110 
111 

我该怎么办呢? 我想实际将它们存储在矩阵中。我试图

for n=1:2^4 
r(n)=dec2bin(n,5); 
end; 

,但给了错误“在分配A(:) = B,A和B元素的数量必须相同。

+0

可以使用位计数器 – 2012-03-19 09:01:03

回答

9

只是循环遍历[0,2^n)所有整数,打印数量为二进制如果你总是希望有n数字(如插入前导零),这看起来像:

for ii=0:2^n-1, 
    fprintf('%0*s\n', n, dec2bin(ii)); 
end 

编辑:有许多的办法把结果放在一个矩阵。 最简单的是使用

x = dec2bin(0:2^n-1); 

这将产生char类型的n -by- 2^n矩阵。每行是位串之一。

如果你真的想存储字符串每行中,你可以这样做:

x = cell(1, 2^n); 
for ii=0:2^n-1, 
    x{ii} = dec2bin(ii); 
end 

不过,如果你正在寻找有效的处理,你应该记住,整数已经存储在内存中的二进制!所以,向量:

x = 0 : 2^n-1; 

包含尽可能以最高效的内存和CPU高效的方式二进制模式。唯一的折衷是,使用这种紧凑的表示方式,您将无法使用64位以上的32位表示模式。

+0

我想实际上它们存储在矩阵。我试过 n = 1:2^4 r(n)= dec2bin(n,5); 结束; 但这给了错误“在赋值A(:) = B中,A和B中的元素数量必须相同。” – 2012-03-19 09:08:09

+0

或更高效的版本:s = dec2bin(0:2^n-1) – 2012-03-19 09:15:02

+0

@HappyMittal:关键的思想是“模式”只是从0到2^n-1的整数。你想要一个'n'-by-'2^n'布尔矩阵,或者一个长度为'n'的2^n'字符串的单元阵列吗? – 2012-03-19 09:28:46

0

很多方式来做这个排列。如果你想用一个数组计数器来实现:为三个位置(2^0,2^1,2^2)中的每一个设置一个从0到1的计数器数组。让起始号码为000(存储在数组中)。使用计数器并增加其第一位(2^0)。编号将为001.在位置(2^0)重置计数器并在2^1增加计数器并循环直到完成所有计数器。

0

这是一个单行的答案,让你所有2^n位组合的双阵列的问题:

bitCombs = dec2bin(0:2^n-1) - '0'

相关问题