matlab

2012-11-11 16 views
5

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

cost =  [0.2 0.0 0.3; 0.4 0 0; 0.5 0 0]; 
available = [1 1 0 ; 1 0 0; 0 0 0]; 
available = logical(available); 

मैं लागत मैट्रिक्स में मिनट उपलब्ध तत्व, जो इस मामले में 0.2, 0.0 और 0.4 तुलना और 0.0 के सूचकांक है, जो (1, 2) या 4 लागत मैट्रिक्स में है वापसी होगी के सूचकांक प्राप्त करना चाहते हैं ।

मैं

mul = cost .* available;  % Zero if not available, but I can't know if it is zero because cost is zero 
mul(~mul) = nan;    % Set zero to be NaN 
[minVal, minId] = min(mul) 

यह मिनट गैर शून्य लागत प्राप्त करने के लिए मदद मिलेगी कोशिश की, लेकिन अगर वहाँ शून्य तत्व है जो उपलब्ध हैं मौजूद है, यह गलत होगा।

तो क्या ऐसा करने का एक बेहतर तरीका है?

+3

ऑफ-विषय: आपको कार्यों जैसे नामकरण करने से बचना चाहिए (उदाहरण के लिए 'min')। –

उत्तर

2

यहां दो संभावित समाधान हैं। दोनों अनिवार्य रूप से सभी गैर-उपलब्ध लागतों को Inf में परिवर्तित करना शामिल करते हैं।

%#Set up an example 
Cost =  [0.2 0 0.3; 0.4 0 0; 0.5 0 0]; 
Available = [1 1 0; 1 0 0; 0 0 0]; 

%#Transform non-available costs to Inf 
Cost(Available == 0) = Inf; 

%#Obtain indices using find 
[r, c] = find(Cost == min(min(Cost))) 

%#Obtain linear indices and convert using ind2sub 
[~, I1] = min(Cost(:)); 
[r2, c2] = ind2sub(size(Cost), I1); 

दोनों समाधान केवल उदाहरण में पहला न्यूनतम मान लौटाएंगे कि एक अद्वितीय न्यूनतम नहीं है। साथ ही, विधि प्रतिकूल मामले में विफल हो जाएगी कि सभी उपलब्ध लागत Inf हैं (लेकिन मुझे लगता है कि यदि आपकी सभी लागत अनंत हैं तो आपको बड़ी समस्याएं मिलती हैं ...)।

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

+0

मुझे लगता है कि यह सही नहीं छोड़ दिया गया है। 'मिनट (लागत (उपलब्ध));' लागत (उपलब्ध) 'द्वारा लौटाए गए नए मैट्रिक्स में मिनीआईडी ​​लौटाता है, जो इस मामले में 3 है। लेकिन मैं चाहता हूं कि आईडी लागत मैट्रिक्स में हो, जो 4 होना चाहिए। – Ovilia

+0

इंडेक्स पहला न्यूनतम तत्व पर्याप्त है। – Ovilia

+0

@ ओविलिया मुझे लगता है कि मुझे अब मिल गया है ... –