2011-12-13 12 views
5

क्या MATLAB में कोई कमांड या एक-पंक्ति रणनीति है जो n सेल सरणी के घटकों के सभी संयोजनों को वापस कर देगी, एक समय में n लिया गया?MATLAB: सेल arrays की मनमानी संख्या के संयोजन

मैं क्या हासिल करना चाहते हैं का एक उदाहरण:

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

निकटता से संबंधित: [मैटलैब - कुछ वैक्टरों के तत्वों के सभी संभावित संयोजन उत्पन्न करें] (http://stackoverflow.com/q/4165859/52738), [MATLAB: सेट की अनियंत्रित संख्या में आइटम के सभी संयोजनों का आकलन] (http://stackoverflow.com/q/6607355/52738), [मैं पाठ के सेट में वर्णों के सभी संयोजन कैसे बना सकता हूं?] (http://stackoverflow.com/q/5623120/52738)। संख्यात्मक वैक्टर के साथ पहला दो सौदा, और चरित्र सरणी के साथ तीसरा सौदों, लेकिन अंतर्निहित समाधान सेल सरणी के लिए प्रभावी रूप से समान है। – gnovice

उत्तर

6

हालांकि मैं एक related/near duplicate question करने के लिए my answer में इसका समाधान, मैं, क्योंकि ऐसा लगता कि आप एक सामान्यीकृत समाधान चाहते हैं मेरे यहाँ समाधान के एक अलग संस्करण पोस्टिंग कर रहा हूँ और मेरा दूसरा उत्तर तीन इनपुट सेट के मामले के लिए विशिष्ट है। यहाँ एक समारोह है कि आप क्या चाहते हैं क्या करना चाहिए सेल सरणी आदानों के किसी भी संख्या के लिए है:

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

एक 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

संबंधित मुद्दे