2009-12-16 10 views
64

क्या मैट्रिक्स में कोई निश्चित मान है या नहीं, यह पता लगाने के लिए MATLAB फ़ंक्शन में कोई बनाया गया है? (आला PHP के in_array())'मैट्रिक्स के लिए फ़ंक्शन मान एक्स है?'

+0

फ़्लोटिंग पॉइंट डेटा के लिए जहां सहिष्णुता वांछित हो सकती है, ध्यान दें कि संस्करण R2015a ने एक अंतर्निहित फ़ंक्शन के साथ इसे संभालने के लिए नई कार्यक्षमता को जोड़ा है।पूर्णांक-मूल्यवान डेटा के लिए स्वीकृत समाधान बहुत अच्छे हैं, लेकिन फ्लोट के लिए, [इस उत्तर] पर जाएं (http://stackoverflow.com/a/28907857/2778484)। स्वयं पदोन्नति के लिए खेद है, लेकिन लोगों के पूछने के बाद MATLAB के लिए यह एक बड़ा जोड़ा है। – chappjc

उत्तर

94

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

X = primes(20); 
ismember([15 17],X) 
ans = 
     0 1 

चूंकि 15 प्रमुख नहीं है, लेकिन 17 है, इसनेम्बर ने यहां अपना काम किया है।

बेशक, ढूंढें (या कोई भी) काम करेगा। लेकिन ये इस अर्थ में वेक्टरकृत नहीं हैं कि यह था। हम यह देखने के लिए परीक्षण कर सकते हैं कि 15 एक्स द्वारा निर्धारित सेट में है, लेकिन उन दोनों संख्याओं का परीक्षण करने के लिए लूप, या लगातार परीक्षण होंगे।

~isempty(find(X == 15)) 
~isempty(find(X == 17)) 

या,

any(X == 15) 
any(X == 17) 

अंत में, मैं कहना है कि सटीक मूल्यों के लिए परीक्षण खतरनाक होते हैं यदि संख्या सच तैरता हो सकता है। जैसा कि मैंने दिखाया है पूर्णांक मानों के खिलाफ टेस्ट आसान हैं। लेकिन फ्लोटिंग पॉइंट नंबरों के खिलाफ परीक्षण आमतौर पर सहिष्णुता को नियोजित करना चाहिए।

tol = 10*eps; 
any(abs(X - 3.1415926535897932384) <= tol) 
+2

तीनों में से सबसे तेज़ 'कोई' लगता है। लेकिन आप इसे स्वयं मापना चाहते हैं ('टिक 'और' toc' का उपयोग करके)। – Lewistrick

+0

फ़्लोटिंग पॉइंट मानों के लिए, यदि आप कम से कम R2015a का उपयोग कर रहे हैं, तो बस ['ismembertol'] (http://stackoverflow.com/a/28907857/2778484) का उपयोग करें। – chappjc

10

आप कर सकते हैं:

A = randi(10, [3 4]);  %# a random matrix 
any(A(:)==5)    %# does A contain 5? 

एक vectorized रास्ता, उपयोग में ऊपर करने के लिए:

any(bsxfun(@eq, A(:), [5 7 11]) 

या @woodchips के रूप में पता चलता है:

ismember([5 7 11], A) 
+0

आप [5 7 11] का उपयोग क्यों कर रहे हैं – Jordan

+1

@ जोर्डन में तर्क के रूप में: उत्तर लौटाया गया तर्क तर्क के समान आकार का एक तार्किक सरणी (सत्य/गलत) है, यह दर्शाता है कि क्या मैट्रिक्स 'ए' में से प्रत्येक में शामिल है मान (जैसे '[सत्य, सत्य, गलत] 'जिसका अर्थ है' ए 'में मान' 5' और '7' है लेकिन' 11' नहीं)। – Amro

+0

अब मुझे मिल गया, धन्यवाद – Jordan

3

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

ismember([15 17],primes(20)) 

लेकिन जब आप चल बिन्दु संख्या के साथ काम कर रहे हैं, या बस पास मैचों करना चाहते हैं (+ - 1000 भी संभव है), सबसे अच्छा समाधान मैंने पाया काफी कुशल File Exchange Submission: ismemberf

है यह देता है एक बहुत ही व्यावहारिक उदाहरण:

[tf, loc]=ismember(0.3, 0:0.1:1) % returns false 
[tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true 

हालांकि डिफ़ॉल्ट सहिष्णुता सामान्य रूप से पर्याप्त होना चाहिए, यह आपको अधिक विकल्प प्रदान

ismemberf(9.99, 0:10:100) % returns false 
ismemberf(9.99, 0:10:100,'tol',0.05) % returns true 
2

फ़्लोटिंग पॉइंट डेटा के लिए, आप नए ismembertol function का उपयोग कर सकते हैं, जो निर्दिष्ट सहिष्णुता के साथ सदस्यता सेट की गणना करता है। यह फ़ाइल एक्सचेंज में पाए गए ismemberf फ़ंक्शन के समान है, सिवाय इसके कि यह अब MATLAB में अंतर्निहित है। उदाहरण:

>> pi_estimate = 3.14159; 
>> abs(pi_estimate - pi) 
ans = 
    5.3590e-08 
>> tol = 1e-7; 
>> ismembertol(pi,pi_estimate,tol) 
ans = 
    1 
संबंधित मुद्दे