2011-02-22 13 views
17

मैं MATLAB में एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो संख्याओं की 2 डी सरणी के न्यूनतम मान का स्थान पाता है। मुझे यकीन है कि इस सरणी में केवल 1 न्यूनतम है, इसलिए सरणी में एक ही न्यूनतम मूल्य वाले एकाधिक स्थान होने पर कोई समस्या नहीं है। मैं सरणी की न्यूनतम मूल्य पा सकते हैं, लेकिन एक 30x30 सरणी में, मुझे पता है कि जो पंक्ति और स्तंभ है कि न्यूनतम मूल्य में है चाहते हैं। min समारोह के विवरण पर2 डी सरणी में न्यूनतम मान की अनुक्रमणिका प्रदर्शित करने के लिए MATLAB कैसे प्राप्त करें?

उत्तर

28

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

>> a=magic(30); 
>> [r,c]=find(a==min(min(a))) 

r = 
    1 
c = 
    8 

या कैसे आप स्थान की जानकारी आप के बजाय एक तार्किक सरणी के साथ यह निर्धारित करना चाहते हो सकता है, जो मामले में तार्किक को संबोधित कर आप एक सच तालिका देने के लिए इस्तेमाल किया जा सकता का उपयोग करना चाहते हैं पर निर्भर करता।

>> a=magic(30); 
>> locn=(a==min(min(a))); 
+0

धन्यवाद !! बिल्कुल मुझे क्या चाहिए! –

7

देखो। यह न्यूनतम मूल्य के साथ ही सूचकांक वापस कर सकता है। दो आयामी सरणी के लिए, बस इसे दो बार कॉल करें।

A = rand(30); % some matrix 
[minColVal, minColIdx] = min(A); 
[minRowVal, minRowIdx] = min(minColVal); 

minVal = minRowVal; 
minValIdx = [minColIdx(minRowIdx), minRowIdx]; 

संपादित करें: @ बी 3 के समाधान शायद computationally अधिक सुरुचिपूर्ण है (तेजी से और की जरूरत कम अस्थायी अंतरिक्ष)

13

आप एक वेक्टर के लिए मैट्रिक्स नयी आकृति प्रदान कर सकता है, MIN का उपयोग कर कम से कम के सूचकांक खोजने के लिए और उसके बाद इस कन्वर्ट एक मैट्रिक्स सूचकांक में रैखिक सूचकांक:

 
>> x = randi(5, 5) 

x = 

    5  4  4  2  4 
    4  2  4  5  5 
    3  1  3  4  3 
    3  4  2  5  1 
    2  4  5  3  5 

>> [value, index] = min(reshape(x, numel(x), 1)); 
>> [i,j] = ind2sub(size(x), index) 

i = 

    3 


j = 

    2 
+0

+1 सुरुचिपूर्ण समाधान! – groovingandi

+6

आप कुछ वर्णों को सहेजने के लिए x (:) के बजाय reshape() के बजाय उपयोग कर सकते हैं। – zellus

+0

@ ज़ेलस: मुझे याद दिलाने के लिए धन्यवाद! मुझे यह घबराहट महसूस हो रही थी कि ऐसा करने का एक और तरीका था। –

0

एक वेक्टर के एक सबसेट में न्यूनतम या अधिकतम ढूंढने के लिए - एक एक वेक्टर और "lowerBound" और "upperBound" है वेक्टर की सीमा से जो बीच में आप अधिकतम खोजने की जरूरत है कर रहे हैं (या मिनट) मूल्य है, तो इस आदेश का उपयोग करें -

[Value,Index]=min(A(lowerBound:upperBound)); 

यह रिटर्न "मान" मिनट या अधिकतम मूल्य एक (lowerBound के बीच) और A (uppedBound) और "सूचकांक" के रूप में "lowerBound" के रूप में ऑफसेट के साथ के रूप में। तो पूर्ण अनुक्रमणिका को खोजने के लिए, आपको इंडेक्स में "लोअरबाउंड" जोड़ना होगा।

0

इनलाइन फ़ंक्शन का उपयोग करके एक वैकल्पिक समाधान काम करेगा।

>> min_index = @(matrix) find(matrix == min(reshape(matrix, [1,numel(matrix)]))); 

    >> a=magic(30); 
    >> [r,c]=min_index(a) 

    r = 
     1 

    c = 
     8 
संबंधित मुद्दे