2013-03-28 8 views
5

मैटलैब मेंरैन्डपर्म() कई यादृच्छिक क्रमपरिवर्तन उत्पन्न कर सकते हैं?

पी = randperm (एन, ट) कश्मीर अद्वितीय n समावेशी 1 से बेतरतीब ढंग से चुना पूर्णांकों युक्त एक पंक्ति वेक्टर देता है।

कर सकते हैं एक randperm करने के लिए कॉल() वैक्टर के कई पंक्तियों को वापस, जिनमें से प्रत्येक के रूप में ऊपर है? यदि नहीं, तो क्या कई यादृच्छिक क्रमपरिवर्तन उत्पन्न करने का कोई अन्य तरीका है?

इस मामले में लूप से बचने के लिए जरूरी है?

धन्यवाद!

उत्तर

5

RANDPERM स्वयं केवल एक क्रमपरिवर्तन देता है। आप पाश से बचना चाहते हैं आप ARRAYFUN से कॉल करने की कर सकते हैं:

Nperm = 5; 
N = 6; 
result = arrayfun(@(x)randperm(N),(1:Nperm)','UniformOutput',0); 

यह Nperm एक्स 1 सेल सरणी वापस आ जाएगी। यह एक छोटे से नंबरों के लिए व्यावहारिक

result = cell2mat(result); 

भी PERMS समारोह है कि सभी क्रमपरिवर्तन देता है, लेकिन: परिवर्तित करने के लिए यह मैट्रिक्स आप CELL2MAT उपयोग कर सकते हैं।

फ़ाइल एक्सचेंज सबमिशन ALLCOMB, PERMS और others भी देखें।

+0

लूप से बचने के लिए जरूरी तेज़ी से तेज होगा? – Tim

+1

आवश्यक नहीं है, विशेष रूप से इस मामले में arrayfun सेल सरणी देता है जो चीजों को धीमा कर सकता है। लेकिन आप टिक/टीओसी के साथ परीक्षण कर सकते हैं। – yuk

1

आप अपेक्षा करते हैं कि सभी क्रमपरिवर्तन परस्पर अद्वितीय हैं, तो आप निम्नलिखित

permN = 5; 
permK = 4; 
nPerms = 10; 
nGoodPerms = 0; 
nMaxFailedTries = 100; 
nFailedTries = 0; 

permList = cell(nPerms, 1); 

while nGoodPerms < nPerms && nFailedTries <= nMaxFailedTries 
    candidatePerm = randperm(permN, permK); 
    if any(cellfun(@(x)~isempty(x) && all(x == candidatePerm), permList)) 
     nFailedTries = nFailedTries + 1; 
    else 
     nGoodPerms = nGoodPerms + 1; 
     permList{nGoodPerms} = candidatePerm; 
    end 
end 

permList = cell2mat(permList{1:nGoodPerms}); 

शायद वहाँ (त्रुटि या) एक चेतावनी चक चाहिए नहीं तो सब का अनुरोध किया क्रमपरिवर्तन उत्पन्न किया गया इस्तेमाल कर सकते हैं। यह भी सुनिश्चित करने के लिए कोई पूर्व चेक जोड़ सकता है कि nPerms बेवकूफ रूप से बड़ा नहीं है (यानी, दिए गए permN और permK के साथ कभी भी उत्पन्न होने से अधिक अद्वितीय क्रमिकताएं)।

1

p = randperm(n) के लिए के रूप में:

मैटलैब 2010a और पुराने, इनपुट पैरामीटर k में समर्थित नहीं है। आप randperm के कोड को देखें, तो

[~, p] = sort(rand(1,n)); 

आप देखेंगे कि यह इसे संशोधित करने के लिए बहुत आसान है इतना है कि यह n तत्वों की m क्रमपरिवर्तन (परिणाम अब आकार की है m एक्स n) पैदा करता है:

[~, p] = sort(rand(m,n), 2); 

p = randperm(n,k) के लिए के रूप में:

मैं नहीं जानता कि कैसे मैटलैब इस मामले में यह होता है, मेरी संस्करण के बाद से इसका समर्थन नहीं करता है। हालांकि, k के लिए n तुलना में काफी छोटा

p = p(:,1:k); 

बहुत ही कुशल नहीं: आप हमेशा के रूप में ऊपर कर सकता है और उसके बाद ट्रिम।

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

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