2011-12-13 89 views
5

在MATLAB中是否有命令或單線策略,將返回單元陣列的組件的所有組合,一次獲取nMATLAB:任意數量的單元陣列的組合

什麼,我想完成一個例子:

A = {'a1','a2'}; 
B = {'b1','b2','b3'}; 
C = combinations(A,B) 
C = {'a1','b1' ; 
    'a1','b2' ; 
    'a1','b3' ; 
    'a2','b1' ; 
    'a2','b2' ; 
    ... } 

的命令應該是能夠接受的參數的任意數,結果在本例中必須儘可能多的列有函數的自變量。 (當然,上面的語法只是意味着爲了說明這將產生任何格式將適合的紙幣的結果的任何方法)

編輯:類似的問題,已經要求的矩陣,而不是細胞,例如link。許多解決方案指向FEX提交allcomb,但所有這些解決方案都只是ndgrid周圍的包裝,它只能用於雙打。任何非數字集的建議?

+1

你可以利用它來進行整數工作組的解決方案,然後將結果(組合)想象爲您的單元陣列的索引。 – Aabaz

+2

密切相關:[Matlab的 - 生成一些向量的元素的所有可能組合(http://stackoverflow.com/q/4165859/52738),[MATLAB:枚舉項的所有組合在集的任意數量] (http://stackoverflow.com/q/6607355/52738),[如何在文本集中創建字符的所有組合?](http://stackoverflow.com/q/5623120/52738)。前兩個涉及數字向量,第三個涉及字符數組,但底層解決方案對於單元陣列實際上是相同的。 – gnovice

回答

6

雖然我解決這個問題的my answerrelated/near duplicate question,我張貼的不同版本在這裏我的解決方案,因爲它似乎你想要一個廣義解決方案,並我的其他答案是特定於三個輸入集的情況。下面是應該做你想做的任何數量的單元陣列輸入的功能:

function combMat = allcombs(varargin) 
    sizeVec = cellfun('prodofsize', varargin); 
    indices = fliplr(arrayfun(@(n) {1:n}, sizeVec)); 
    [indices{:}] = ndgrid(indices{:}); 
    combMat = cellfun(@(c,i) {reshape(c(i(:)), [], 1)}, ... 
        varargin, fliplr(indices)); 
    combMat = [combMat{:}]; 
end 

而且這裏是你會怎麼稱呼它:

>> combMat = allcombs(A, B) 

combMat = 

    'a1' 'b1' 
    'a1' 'b2' 
    'a1' 'b3' 
    'a2' 'b1' 
    'a2' 'b2' 
    'a2' 'b3' 
+0

感謝您提供非常有用的答案,@gnovice。 – foglerit

5

A 2線戰略:

A = {'a1','a2'}; 
B = {'b1','b2','b3'}; 

[a b]=ndgrid(1:numel(A),1:numel(B)); 
C= [A(a(:))' B(b(:))'] 

C = 
    'a1' 'b1' 
    'a2' 'b1' 
    'a1' 'b2' 
    'a2' 'b2' 
    'a1' 'b3' 
    'a2' 'b3' 
+0

非常簡單,乾淨,我喜歡它。我接受了gnovice的普遍性答案,但你的回答對理解他的答案非常有幫助。 – foglerit