2014-09-03 181 views
2

如何知道矩陣的元素只能是0或1,才能生成N * M矩陣的所有可能值?例如,如果我想要一個2 * 2的矩陣,我們可以得到16個不同的可能組合矩陣:[0 0; 0 0],[1 1; 1 1],[1 0; 0 1],[ 1 1; 0 0],[0 0 1 1] ...等在Matlab中生成矩陣的所有可能組合

回答

6

使用dec2base -

combs = dec2base(0:power(2,N*M)-1,2) - '0' 

這產生以行的所有可能的組合。因此,要選擇任何組合,您需要索引到combs。因此,第一個組合[0,0,0,0]將在combs(1,:)處可用,並且最後一個[1,1,1,1]將在comb(end,:)處。

如果可能的值從一組不同的,像0,1,2,3代替,使這個編輯 -

combs = dec2base(0:power(4,N*M)-1,4) - '0' 

如果你想獲得,將具有相同大小的輸入矩陣,使用該組合此 -

combs_matshaped = reshape(permute(combs,[3 2 1]),N,M,[]) 

這產生儘可能多的2D切片作爲有組合的3D陣列和用於矩陣的每一組合爲「索引能夠」與第三維度索引。例如,如果您打算獲得第一個組合,請使用combs_matshaped(:,:,1),對於最後一個組合,請使用combs_matshaped(:,:,end)

+3

完美,偉大的答案!哦,也許只是添加'重塑(梳子(1,:),N,M)'完整性 – Dan 2014-09-03 09:54:31

+0

@Divakar梳子(1,:)將提取它作爲一個矢量而不是一個矩陣,有沒有辦法做到這一點,而不使用循環? – 2014-09-03 09:58:58

+0

多數民衆贊成在罰款,丹回答了我 – 2014-09-03 10:02:31

1

另一種可能性(雖然Divakar's answer更簡單,可能更快):

c = cell(1,N*M); 
[c{end:-1:1}] = ndgrid([0 1 2 3 ]); %// or change set of values: [0 1 2 3] etc 
combs = cell2mat(cellfun(@(x) x(:), c, 'uni', 0)); %// results as row vectors 
combs = reshape(combs.',N,M,[]); %// NxM matrices: combs(:,:,1), combs(:,:,2),...