MATLAB

2010-02-26 11 views
5

में वैक्टर उत्पन्न करना मैं सोच रहा हूं कि MATLAB में एक सीमित सेट के तत्वों के साथ निश्चित लंबाई के सभी वैक्टर उत्पन्न करने के लिए एक प्रभावी तरीका है या नहीं।MATLAB

उदाहरण के लिए, मैं लंबाई 5 के सभी वैक्टरों को केवल 0 या 1 तत्वों के साथ कैसे बना सकता हूं?

उत्तर

3

आपको जो चाहिए वह बिल्कुल नहीं, लेकिन परव वेक्टर क्रमपरिवर्तन उत्पन्न करता है। यदि आपको सटीक समाधान नहीं मिल रहा है, तो आप वेक्टर क्रमपरिवर्तन अनुकूलित कर सकते हैं।

permv

+0

धन्यवाद! मुझे लगता है कि यह वही है जो मुझे चाहिए। –

+0

@ किरण: ध्यान रखें कि आपको पहले से शुरू करने के लिए 5-तत्व वेक्टर और शून्य का चयन करना होगा, फिर PERMS आपको इसके हर क्रमपरिवर्तन देगा। – gnovice

+0

टिप, gnovice के लिए धन्यवाद। यह मेरे कोड को पहले बहुत तेज बनाता है और यह वास्तव में अच्छा है। –

1

न्यू जवाब:

आप DEC2BIN समाधान suggested by AB बजाय BITGET फ़ंक्शन का उपयोग करके (एक woodchips द्वारा सहायता के साथ) में तेजी लाने के कर सकते हैं। इस दृष्टिकोण के दो तरीके हैं। पहले आदानों आकार में बराबर (32-से-5 मैट्रिक्स) बनाने के लिए REPMAT फ़ंक्शन का उपयोग करता:

allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1)); 

और दूसरा केवल कॉल BITGET एक बार हर व्यक्ति बिट के लिए आप प्राप्त करना चाहते हैं:

vec = (0:31)'; 
allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ... 
      bitget(vec,2) bitget(vec,1)]; 

 Method  | Average Time 
-----------------+------------------ 
    DEC2BIN  | 0.000788 s 
    BITGET+REPMAT | 0.000727 s 
    BITGET x5  | 0.000045 s 

आप देख सकते हैं, unrolled BITGET बहुत तेजी से है:

और यहाँ कुछ नमूना समय कर रहे हैं।


पुराना जवाब: एक ही रास्ता (भावी पीढ़ी के लिए)

आप शून्य और लोगों की हर संभव वेक्टर 5 की लंबाई है कि के एक मैट्रिक्स का निर्माण करने के लिए इच्छुक है, तो यह हो सकता है कार्यों PERMS और UNIQUE का उपयोग कर यह करने के लिए (PERMS के बाद से दोहराया पंक्तियों बनाता है):

allCombos = [0 0 0 0 0; 
      unique(perms([0 0 0 0 1]),'rows'); ... 
      unique(perms([0 0 0 1 1]),'rows'); ... 
      unique(perms([0 0 1 1 1]),'rows'); ... 
      unique(perms([0 1 1 1 1]),'rows'); ... 
      1 1 1 1 1]; 
10

उचित तरीके से निर्माण करने के लिए तत्वों के रूप में केवल 0 या 1 के साथ लंबाई 5 के सभी वैक्टर

a = dec2bin(0:31,5) - '0'; 

मुझे आशा है कि आप देखेंगे क्यों।

+0

+1 अच्छा जवाब। एकमात्र संभावित दोष यह है कि DEC2BIN * दर्दनाक * धीमा हो सकता है। – gnovice

+1

@gnovice: आपने मुझे जाने और DEC2BIN स्रोत को देखने के लिए बनाया है। हां, शायद यह बहुत कुशल नहीं है - लेकिन यह एक प्यारा एक-लाइनर है! धन्यवाद। – AVB

+3

लूपिंग के बजाय, लूपिंग न करने के लिए उपयोग करें। >> टिक, ए = शून्य (10,1024); x = 0: 1023, ए (:, x + 1) = str2num (dec2bin (x, 10) '); अंत, toc विलुप्त समय 0.105492 सेकेंड। >> टिक, ए = डीसी 2bin (0: 1023) - '0'; टीओसी विलुप्त समय 0.000868 सेकंड है। –

3

MathWorks 'FileExchange अपने दोस्त है:

तो सबसे पहले समारोह का उपयोग कर, अपने जितना आसान:

VChooseKRO([0 1], 5) 

तुम भी यह परिमित सेट के रूप में तार के एक सेल सरणी के लिए काम कर सकते हैं:

C = {'a' 'b' 'c' 'd'}; 
C(VChooseKRO(1:numel(C), 2))