2010-03-14 25 views
7

में किसी भी सरणी तत्व के मान के बराबर है या नहीं, क्या कोई मुझे बता सकता है कि कोई निश्चित तरीका है (MATLAB में) यह जांचने के लिए कि कोई निश्चित मान किसी अन्य सरणी के भीतर संग्रहीत किसी भी मान के बराबर है या नहीं?यह पता लगाना कि कोई मान MATLAB

जिस तरह से मैं इसका उपयोग करना चाहता हूं यह जांचना है कि एक मैट्रिक्स में एक तत्व अनुक्रमणिका किसी अन्य सरणी में संग्रहीत मानों के बराबर है (जहां संग्रहित मान तत्वों के सूचकांक होते हैं जो एक निश्चित मानदंड को पूरा करते हैं)।

तो, अगर तत्व है जो मानदंडों को पूरा के सूचकांकों नीचे मैट्रिक्स में जमा हो जाती है:

criteriacheck = [3 5 6 8 20]; 

मुख्य सरणी के माध्यम से जा रहे हैं (array कहा जाता है) और यह पता चल सके सूचकांक मैचों:

for i = 1:numel(array) 
    if i == 'Any value stored in criteriacheck' 
    %# "Do this" 
    end 
end 

क्या किसी को यह पता है कि मैं इसके बारे में कैसे जा सकता हूं?

कई यह करने के लिए तरीके:

उत्तर

3

आप खोज आदेश

if (~isempty(find(criteriacheck == i))) 
    % do something 
end 
19

उत्कृष्ट answer previously given by @woodchips रूप में अच्छी तरह यहाँ लागू होता है इस्तेमाल कर सकते हैं। इस्मेम्बर सबसे पहले दिमाग में आता है, क्योंकि यह एक निर्धारित सदस्यता कार्रवाई है जिसे आप लेना चाहते हैं। इस प्रकार

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) 
3

नोट: हालांकि इस सवाल का जवाब शीर्षक में प्रश्न को हल नहीं करता है, यह कैसे आप पाश के लिए अपनी रचना कर रहे हैं (जो होने को नकारता का समाधान है कि तुम क्या कर रहे हैं करने के लिए के साथ एक अधिक मौलिक मुद्दे के समाधान है शीर्षक में पूछना)। ;)

के आधार पर पाश के लिए आपके द्वारा लिखी गई, अपने सरणी criteriacheckarray में सूचकांक का एक सेट हो गया लगता है, और इन अनुक्रमित तत्वों से प्रत्येक के लिए आप कुछ गणना करना चाहते हैं। यह इतना है तो यहां आप अपने पाश के लिए डिजाइन करने के लिए के लिए एक वैकल्पिक तरीका है:

for i = criteriacheck 
    %# Do something with array(i) 
end 

criteriacheck में सभी मान से अधिक हो जाएगा ताकि पाश, प्रत्येक अनुवर्ती मूल्य के लिए i स्थापित करने (यानी 3, 5, 6, 8, और 20 आपके उदाहरण में)। यह array के प्रत्येक तत्व पर लूपिंग से अधिक कॉम्पैक्ट और कुशल है और यह जांच रहा है कि सूचकांक criteriacheck में है या नहीं।

नोट: जैसा कि जोनास बताते हैं, आप यह सुनिश्चित करना चाहते हैं कि criteriacheck लूप को ठीक से काम करने के लिए एक पंक्ति वेक्टर है। अगर वहाँ एक रास्ता (MATLAB में है

for i = criteriacheck(:)' 
... 
+1

के साथ बेहतर रूप से बेहतर हैं ध्यान दें कि मानदंड को एक पंक्ति वेक्टर होने की आवश्यकता है, यानी [3,5,6 ...], [3; 5; 6 ...] के बजाय। सुरक्षित होने के लिए, मैं << के लिए i = criteriacheck (:) '>> लिखूंगा। किसी भी दर पर, +1 – Jonas

+0

@ जोनास: अच्छा विचार, बस सुरक्षित रहें। ;) – gnovice

1

मूल प्रश्न "किसी को मुझे बता सकते हैं: आप (:)' वाक्य रचना के साथ जिसके बाद reshapes it into a column vector और फिर transposes it एक पंक्ति वेक्टर में से एक पंक्ति वेक्टर में किसी भी मैट्रिक्स फार्म कर सकते हैं) यह जांचने के लिए कि कोई निश्चित मान किसी अन्य सरणी के भीतर संग्रहीत किसी भी मान के बराबर है या नहीं? " किसी भी पाश के बिना हल किया जा सकता है।

बस setdiff फ़ंक्शन का उपयोग करें।

0

मुझे लगता है कि इंटरैक्ट फ़ंक्शन वह है जिसे आप ढूंढ रहे हैं।

सी = छेड़छाड़ (ए, बी) ए और बी दोनों के लिए सामान्य मान लौटाता है सी के मान क्रमबद्ध क्रम में हैं।

http://www.mathworks.de/de/help/matlab/ref/intersect.html

सवाल if i == 'Any value stored in criteriacheck भी इस तरह से जवाब दिया जा सकता है अगर आप i एक छोटी सी मैट्रिक्स पर विचार करें। हालांकि, आप any(i==criteriacheck)

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