Matlab

2011-12-14 13 views
6

में "स्मार्ट व्यवहार" बंद करें Matlab पर मुझे एक चीज़ पसंद नहीं है: यह कभी-कभी बहुत स्मार्ट होने की कोशिश करता है। उदाहरण के लिए, अगर मैंMatlab

a = -1; sqrt(a) 

की तरह एक नकारात्मक वर्गमूल है मैटलैब एक त्रुटि फेंक नहीं है लेकिन जटिल संख्याओं को चुपचाप चला जाता है। ऋणात्मक लघुगणकों के लिए भी यही होता है। इससे अधिक जटिल एल्गोरिदम में त्रुटियों को ढूंढना मुश्किल हो सकता है।

ऐसा ही एक समस्या यह है कि Matlab "हल" चुपचाप गैर द्विघात रैखिक प्रणालियों निम्न उदाहरण में की तरह है:

A=eye(3,2); b=ones(3,1); x = A \ b 

जाहिर xA*x==b संतुष्ट नहीं करता (यह बजाय एक कम से कम वर्ग समस्या का हल)।

क्या "सुविधाओं" को बंद करने की कोई संभावना है, या कम से कम इस मामले में मैटलैब एक चेतावनी संदेश प्रिंट करने दें? यह वास्तव में कई स्थितियों में बहुत मदद करता है।

+1

मुझे आश्चर्य है कि लोग इस सवाल को क्यों कम करते हैं। मुझे लगता है, यह पूछने के लिए पूरी तरह से कानूनी है। इसके अलावा, मुझे यकीन है कि बहुत से लोग हैं जो वर्णित व्यवहार की वजह से सूक्ष्म बग की तलाश में समय खो चुके हैं। – Boris

+1

जिस तरह से आपका प्रश्न पढ़ता है, वह कुछ ऐसा हो सकता है जैसे "मैंने वास्तव में उन दस्तावेज़ों को नहीं पढ़ा जो बताते हैं कि मैटलैब जटिल संख्या का समर्थन करता है, और यह बताता है कि बैकस्लैश ऑपरेटर क्या करता है। क्या मैं मैटलैब कर सकता हूं जो मैंने गलत तरीके से किया है, क्योंकि मैं वास्तव में दस्तावेज़ीकरण को पढ़ने में असमर्थता के बारे में निराश हूं? "। जबकि बैकस्लैश ऑपरेटर के साथ इस मुद्दे पर मैं आपसे असहमत हूं, मैं सहमत हूं कि जटिल संख्या किसी समस्या का संकेत हो सकती है। इस प्रकार यह अच्छा होगा अगर डीबगर में "dbstop if nan/inf" के अलावा "dbstop अगर जटिल" था। – Jonas

+0

@ जोनास मैंने इस सवाल को इस तरह से तैयार करने की कोशिश की है कि पाठक के पास यह इंप्रेशन नहीं है, ऐसा लगता है जैसे मैं असफल रहा :(। आप सही हैं, दस्तावेज उस पर बिल्कुल स्पष्ट है। मुझे लगता है कि मैटलैब "ओवरस्यूज" ऑपरेटर जो बग का कारण बन सकता है और यह बुरा है।एक और जिसे अक्सर शुरुआती लोगों द्वारा गलत किया जाता है वह निम्न है: ए (गलत परिभाषित) फ़ंक्शन 'f = @ (x) x * ((x + 1)/x)' परिणाम देता है 'f ([1,2]) = [1.6,3.2] 'जबकि अधिकांश शुरुआती परिणाम [2,3]' की उम्मीद करेंगे। एक बड़े कार्यक्रम में ऐसी बग को खोजने में बहुत मुश्किल होती है। – Boris

उत्तर

3

मुझे नहीं लगता कि आपके उदाहरणों में "स्मार्ट होने" जैसी कुछ भी है। ऋणात्मक संख्या का वर्ग जड़ जटिल है। इसी तरह, बाएं-डिवीजन ऑपरेटर को मैटलैब में गैर स्क्वायर इनपुट के लिए छद्म संकेत की गणना के रूप में परिभाषित किया गया है।

यदि आपके पास ऐसा कोई एप्लिकेशन है जो जटिल संख्याओं को वापस नहीं लेना चाहिए (फ़्लोटिंग पॉइंट त्रुटियों से सावधान रहें!), तो आप इसके लिए परीक्षण करने के लिए isreal का उपयोग कर सकते हैं। यदि आप बाएं डिवीजन ऑपरेटर को छद्म संकेत की गणना नहीं करना चाहते हैं, तो A वर्ग के लिए परीक्षण करें।

वैकल्पिक रूप से, अगर किसी कारण से आप वास्तव में इनपुट सत्यापन करने में असमर्थ हैं, तो आप sqrt और \ दोनों ही काम करने के लिए सकारात्मक संख्या पर ओवरलोड कर सकते हैं और Pseudoinverse की गणना नहीं कर सकते हैं।

+0

बेशक, मैं अपने सभी पैरामीटर देख सकता हूं लेकिन अगर 90% मामलों में मेरा इनपुट वास्तविक मूल्यवान है, तो आउटपुट भी वास्तविक होना चाहिए। इसके अलावा, एक रैखिक प्रणाली का समाधान यह है कि अधिकांश मामलों में लोग बैकस्लैश ऑपरेटर का उपयोग करते समय अपेक्षा करते हैं। मैं बस पैरामीटर द्वारा व्यवहार को ट्रिगर करना चाहता हूं। – Boris

+1

@ बोरीस: हम इस पर बहुत अलग तरीके से जाना प्रतीत होता है। 100% मामलों में जहां मैं ऋणात्मक मूल्य के वर्ग रूट लेता हूं, मैं जटिल आउटपुट की अपेक्षा करता हूं। इसके अलावा, मैं बैकस्लैश ऑपरेटर का उपयोग विशेष रूप से अत्यधिक निर्धारित सिस्टम के लिए करता हूं (क्योंकि दूसरे को मेरे अनुप्रयोगों में कभी नहीं होना चाहिए)। – Jonas

+1

@ बोरीस: दुर्भाग्य से, कोई अंतर्निहित स्विच नहीं है जो केवल वास्तविक संख्याओं को गणना में होने की अनुमति देता है (जब तक कि आप सभी पूर्णांक के साथ काम नहीं करना चाहते)। – Jonas

3

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

  • पहले मामले के लिए, realsqrt बजाय
  • का उपयोग दूसरे मामले के लिए, का उपयोग inv(A) * b बजाय

या वैकल्पिक रूप से, पहले उचित जांच करता है शामिल हैं/के बाद आप कॉल में निर्मित कार्य करता है। यदि आपको हर बार ऐसा करने की ज़रूरत है, तो आप हमेशा अपने कार्यों को लिख सकते हैं।

+0

* विज्ञापन होमिनम * (और हटा दिया गया है) के लिए अनिश्चित था, लेकिन अन्यथा, समाधान डाउनवोट के योग्य नहीं है। 'Realsqrt' खोजने के लिए मुझसे +1। – Jonas

+2

प्रस्ताव 'आविष्कार (ए) * बी' कई मामलों में बहुत धीमा है (विशेष रूप से जब ए स्पैस है) और इसका उपयोग नहीं किया जाना चाहिए। – Boris

+0

@ बोरीस, मैं सहमत हूं, लेकिन अगर आपको ऐसे संस्करण की आवश्यकता है जो केवल तब काम करे जब ए वर्ग और गैर-एकवचन है, तो यह सबसे आसान विकल्प है। आप सबसे अच्छे विकल्प हैं दो अपने बैकस्लैश को अपने स्वयं के फ़ंक्शन में लपेटें। – Nzbuu