2010-11-12 15 views
31

मैं किसी दिए गए वैक्टर के तत्वों के सभी संभावित संयोजन उत्पन्न करना चाहता हूं।कुछ वैक्टरों (कार्टेशियन उत्पाद) के तत्वों के सभी संभावित संयोजन उत्पन्न करें

उदाहरण के लिए, [1 2], [1 2] और [4 5] के लिए मैं तत्वों उत्पन्न करना चाहते हैं:

[1 1 4; 1 1 5; 1 2 4; 1 2 5; 2 1 4; 2 1 5; 2 2 4; 2 2 5]

समस्या यह है कि मैं वैक्टर की संख्या पता नहीं है जिसके लिए मैं संयोजन की गणना करनी है । इस मामले में 3 हो सकते हैं, या 10 हो सकते हैं, और मुझे सामान्यीकरण की आवश्यकता है। क्या आप कृपया MATLAB में मेरी सहायता कर सकते हैं? क्या पहले से ही एक पूर्वनिर्धारित कार्य है जो यह कार्य कर सकता है?

+10

जो आप खोज रहे हैं उसे वैक्टर के 'कार्टेशियन उत्पाद' कहा जाता है। इसके लिए आपको कुछ भाग्य हो सकता है। –

उत्तर

16

फ़ाइल एक्सचेंज में ALLCOMB फ़ंक्शन का प्रयास करें।

आप एक सेल सरणी में आप वैक्टर स्टोर हैं, तो आप इसे इस तरह चला सकते हैं:

a = {[1 2], [1 2], [4 5]}; 
allcomb(a{:}) 
ans = 

    1  1  4 
    1  1  5 
    1  2  4 
    1  2  5 
    2  1  4 
    2  1  5 
    2  2  4 
    2  2  5 
+6

ध्यान दें कि 'ऑलोकॉमबी' अनिवार्य रूप से उसी तरह से 'एनडीजीआईडीआईडी' का उपयोग करता है जैसे एमरो के उत्तर में, शीर्ष पर त्रुटि-प्रमाणन के साथ। – lodhb

+0

हाँ धन्यवाद, जो मैं देख रहा था .. :-) – tim

46

NDGRID फंक्शन का उपयोग करके इस समाधान पर विचार करें:

sets = {[1 2], [1 2], [4 5]}; 
[x y z] = ndgrid(sets{:}); 
cartProd = [x(:) y(:) z(:)]; 

cartProd = 
    1  1  4 
    2  1  4 
    1  2  4 
    2  2  4 
    1  1  5 
    2  1  5 
    1  2  5 
    2  2  5 

या आप एक सामान्य समाधान चाहते हैं किसी भी सेट के लिए (मैन्युअल रूप से चर बनाने के बिना), इस फ़ंक्शन परिभाषा का उपयोग करें:

function result = cartesianProduct(sets) 
    c = cell(1, numel(sets)); 
    [c{:}] = ndgrid(sets{:}); 
    result = cell2mat(cellfun(@(v)v(:), c, 'UniformOutput',false)); 
end 

ध्यान दें कि अगर आप चाहें, तो आप परिणामों को सॉर्ट कर सकते हैं:

cartProd = sortrows(cartProd, 1:numel(sets)); 

इसके अलावा, कोड ऊपर अगर सेट नहीं डुप्लिकेट मानों (पूर्व: {[1 1] [1 2] [4 5]}) है जांच नहीं करता। अगर आप चाहते हैं कि यह एक पंक्ति जोड़ने के लिए:

sets = cellfun(@unique, sets, 'UniformOutput',false); 
11

यह देर से जवाब, दो अतिरिक्त समाधान प्रदान करता है जहां दूसरी समाधान (मेरी राय में) और लगाने से MATLAB के शक्तिशाली ndgrid साथ एमरो के जवाब समाधान पर एक सुधार है उच्च प्रदर्शन के लिए सेल सरणियों के बजाय अल्पविराम से अलग सूची,

  1. आप तंत्रिका नेटवर्क उपकरण बॉक्स है: का उपयोग combvec
  2. आप नहीं करते हैं टूलबॉक्स है, जैसा आम तौर पर मामला है: नीचे किसी भी सेट के लिए कार्टेशियन उत्पाद को सामान्यीकृत करने का एक और तरीका है।

बस के रूप में एमरो उसके जवाब में किया था, अल्पविराम से अलग सूचियों वाक्य रचना (v{:}) दोनों इनपुट और ndgrid के आउटपुट आपूर्ति करती है। अंतर (चौथी लाइन) है कि यह cellfun और cell2mat से बचा जाता है अल्पविराम से अलग सूची, इनपुट के रूप में cat के लिए आवेदन फिर से, अब तक है:

N = numel(a); 
v = cell(N,1); 
[v{:}] = ndgrid(a{:}); 
res = reshape(cat(N+1,v{:}),[],N); 

cat और reshape के उपयोग के निष्पादन समय लगभग कटौती छमाही में। यह दृष्टिकोण my answer to an different question, और more formally by Luis Mendo में प्रदर्शित किया गया था।

0

हम भी matlab

no_inp=3 % number of inputs we want...in this case we have 3 inputs     
    a=[1 2 3] 
    b=[1 2 3] 
    c=[1 2 3] 

    pre_final=combvec(c,b,a)'; 
    final=zeros(size(pre_final)); 

    for i=1:no_inp 
    final(:,i)=pre_final(:,no_inp-i+1); 
    end 
    final 

में 'combvec' शिक्षा का उपयोग कर सकते आशा है कि यह मदद करता है। शुभकामनाएँ।

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