2012-03-19 87 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'

相關問題