2010-04-22 17 views
50

मान लीजिए मैं निम्नलिखित मैट्रिक्स है:एक मैट्रिक्स में एन सबसे बड़ा तत्वों का सूचकांक जाओ

01 02 03 06 
03 05 07 02 
13 10 11 12 
32 01 08 03 

और मैं (शीर्ष 5 तत्वों का सूचकांक चाहते इस मामले में, 32, 13, 12, 11 , 10)। MATLAB में ऐसा करने का सबसे साफ तरीका क्या है?

+2

एक स्पष्टीकरण: यदि आप बार-बार तत्वों से निपटने के लिए कैसे चाहेगा? उदाहरण के लिए, यदि संख्या 32 7 बार दिखाई देती है, तो क्या आप सभी 7 के लिए सूचकांक प्राप्त करना चाहते हैं, या उनमें से केवल पांच, या उनमें से केवल 1 और फिर अगले 4 सबसे बड़े तत्वों के लिए सूचकांक प्राप्त करना चाहते हैं? – gnovice

+1

@Eric Leschinski कृपया शीर्षकों में टैग न जोड़ें, यह आवश्यक नहीं है और आम तौर पर समुदाय द्वारा निराश (देखें [इस विषय पर आधिकारिक उत्तर के लिए यह मेटा पोस्ट] (http://meta.stackexchange.com/a/ 5069/151385)) –

उत्तर

72

दोहराए गए मूल्यों से निपटने के तरीके के आधार पर आप इसे दो तरीकों से कर सकते हैं। यहाँ एक समाधान है कि 5 सबसे बड़ा मूल्यों के लिए सूचकांक पाता है (जो बार-बार मूल्यों शामिल हो सकते हैं) है:

[sortedValues,sortIndex] = sort(A(:),'descend'); %# Sort the values in 
                %# descending order 
maxIndex = sortIndex(1:5); %# Get a linear index into A of the 5 largest values 

यहाँ एक समाधान है कि 5 सबसे बड़ा अद्वितीय मान पाता है, तो उन मूल्यों के बराबर सभी तत्वों को पाता है:

sortedValues = unique(A(:));   %# Unique sorted values 
maxValues = sortedValues(end-4:end); %# Get the 5 largest values 
maxIndex = ismember(A,maxValues);  %# Get a logical index of all values 
             %# equal to the 5 largest values 
+1

असल में, gnovice द्वारा अंतिम चरण को करने की कोई आवश्यकता नहीं है। क्रम का दूसरा आउटपुट टैग के लिए टैग की एक सूची है। इसलिए उन चयनित मानों की अनुक्रमणिका क्रम से संबंधित टैग द्वारा दी जाती है। यदि आप सबस्क्रिप्ट की एक जोड़ी के मामले में इंडेक्स की इच्छा रखते हैं, तो ind2sub पर कॉल करें। –

+0

@woodchips: अच्छी पकड़। जैसा कि आपने टिप्पणी की थी, मैं इसे बदलने की प्रक्रिया में था, साथ ही साथ दोहराए गए मूल्यों को एक अलग तरीके से निपटने के लिए एक और विकल्प जोड़ रहा था। – gnovice

+3

यह विधि शायद छोटे मैट्रिक्स के लिए सबसे साफ है, लेकिन ओ (एन * लॉग (एन) जैसे स्केल को स्केल करने के बाद बड़े मैट्रिस के लिए स्पष्ट रूप से उप-इष्टतम है, जबकि इसे "गैर मैटलैब रास्ता" करने से ओ (एन) की तरह स्केल होगा। – Adrien

15

यदि आपके पास एक बड़ी सरणी है और केवल इससे कुछ तत्व चाहते हैं। यह मेरा समाधान होगा।

Arraycopy = Array; 
for j = 1:n 
    [a, Index(j)] = max(Arraycopy); 
    Arraycopy(Index(j)) = -inf; 
end 
maximumValues = Array(Index); 

मुझे लगता है कि यह सॉर्ट समाधान की तुलना में तेज़ और कम रैम की मांग करनी चाहिए।

+2

यह केवल तभी काम करता है जब n सबसे बड़ा तत्व 0 से बड़ा हो। अन्यथा मिनट से 0 (Arraycopy, ...) को प्रतिस्थापित करें। – Unapiedra

7

आप matlabcentral पर matlab प्रश्नों के अच्छे उत्तर भी पा सकते हैं। मुझे एक ही चीज़ की खोज करते समय वहां एक अच्छा मेक्सिको कार्यान्वयन मिला।

यह ब्रूनो लुओंग द्वारा सी-मेक्स के साथ लागू आंशिक त्वरित-प्रकार एल्गोरिदम का उपयोग करके किया जाता है। जटिलता ओ (एन + के.लॉग (के)) है, जहां एन सरणी का आकार है, और के चयनित तत्वों की संख्या है। यह बड़े आकार के इनपुट के लिए एसओआरटी या MIN/MAX के एकाधिक कॉल से तेज़ है। बहुआयामी क्षमता समर्थित

http://www.mathworks.com/matlabcentral/fileexchange/23576-minmax-selection

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