2014-11-26 10 views
5

चूंकि मैटलैब का अर्थ है, आमतौर पर फ़ंक्शन हस्ताक्षर को लागू करने वाले फ़ंक्शन की शुरुआत में बहुत समय व्यतीत करते हैं। उदाहरण के लिएMatlab में assert() का उपयोग कब करें?

if nargin ~= 2; error('must provide two input args a and b'); end 
if a < 0||a ~=floor(a); error('input arg1 must be positive non-zero integer'); end 
if ~isa(b,'cell') ... 

इसके बजाय मैटलैब के assert() का उपयोग करना बेहतर है? यदि नहीं, Matlab में assert() का उपयोग करने के लिए उचित समय कब है?

उत्पादन कोड here में जोर देने का उपयोग करने पर एक बड़ी चर्चा है लेकिन मुझे यकीन नहीं है कि यह व्याख्या कोड पर लागू होता है। इसी तरह, एक और अच्छी चर्चा here और मैं वर्तमान राज्य के बारे में विश्वास व्यक्त करने के लिए @ डैन डायर से सहमत हूं। हालांकि, पाइथन here लोगों के लिए एक समान चर्चा को देखते हुए, केवल उन परिस्थितियों के लिए ज़ोर देते हैं जो कभी नहीं होना चाहिए (असाधारण मामलों के लिए अपवादों की तरह) जो थोड़ा विरोधाभासी w.r.t. है। पिछले संदर्भ।

शायद यह व्याख्या की गई भाषाओं में भूमिका निभाने और मैटलैब के बारे में कम भूमिका के बारे में एक सवाल है।

+0

मैं प्रोटोटाइप के बहुत से करने के लिए मैटलैब कोड लिखता हूं। मुझे यकीन नहीं है कि "उचित" उपयोग क्या है, लेकिन मैं अनिवार्य रूप से विश्वास-वर्तमान-राज्य की व्याख्या के साथ जाता हूं, और अक्सर उनका उपयोग करता हूं। मैटलैब के किसी भी नए संस्करण में प्रोफाइलिंग करते समय मैंने प्रदर्शन के मुद्दों पर ध्यान नहीं दिया है। मुझे पसंद है कि वे अक्सर व्यवहार की जांच के लिए कोड में कितने साफ हैं। हालांकि, मैं शायद ही कभी matlab में कोई उत्पादन कोड करता हूं :) – adalca

उत्तर

3

अधिकांश भाग के लिए, वहाँ

assert(X,...) 

और

if (~X) 
    error(...) 
end 

और उन दोनों के बीच अपनी पसंद सुविधा या शैली की बात है कोई फर्क नहीं है।

MATLAB- आधारित परियोजनाओं में गैर-उत्पादन और उत्पादन कोड के बीच अंतर अक्सर अन्य भाषाओं के आधार पर परियोजनाओं में भेद के समान नहीं होता है।

यह आंशिक रूप से है क्योंकि, जैसा कि आप कहते हैं, MATLAB आमतौर पर संकलित करने के बजाय व्याख्या की जाती है; हालांकि MATLAB कंपाइलर या बिल्डर उत्पादों का उपयोग करके अनुप्रयोगों का उत्पादन करना संभव है, हालांकि सख्ती से "संकलित" नहीं है, दृश्य स्रोत कोड नहीं है और इसे डीबग नहीं किया जा सकता है।उन अनुप्रयोगों के लिए आपको अपवादों और त्रुटियों को सावधानीपूर्वक संभालने की आवश्यकता होगी जैसे आप एक संकलित भाषा के साथ करेंगे।

यह भी आंशिक रूप से है क्योंकि "उत्पादन" का अर्थ अक्सर उन परियोजनाओं के लिए कुछ अलग है जो MATLAB का उपयोग अन्य भाषाओं में परियोजनाओं के लिए करते हैं; उदाहरण के लिए, इसका अर्थ यह हो सकता है कि MATLAB कोड स्वचालित रूप से एक कार इंजन नियंत्रक को तैनाती के लिए सी में परिवर्तित कर दिया गया है, या इसका अर्थ यह हो सकता है कि कुछ MATLAB कोड एक वित्तीय पूर्वानुमान मॉडल चला रहे थे और उत्पादन डेटाबेस में परिणाम लिख रहे थे।

एक विशेष मामला है जहां assertif..error..end के बजाय उपयोग किया जाना चाहिए, जो तब होता है जब आप MATLAB कोडर से सी कोड उत्पन्न करने के लिए MATLAB कोडर का उपयोग कर रहे हैं। MATLAB कोडर MATLAB कोड में assert कथनों की जांच करता है ताकि वे सी में परिवर्तित करने के लिए आवश्यक चर के गुणों का अनुमान लगा सकें, और बेहतर सी कोड उत्पन्न कर सकते हैं यदि यह आपके द्वारा किए गए चर (जैसे सरणी आकार और प्रकार) के बारे में तथ्यों को ग्रहण कर सकता है।

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

+0

मैंने इनपुटपर्सर के बारे में कभी नहीं सुना है ?! महान जानकारी, बहुत सराहना की। –

2

रास्ता MATLAB दावे संभालती है इसका मतलब है कि, एक उपयोगकर्ता के नजरिए से, वहाँ बयानों के बीच कोई अंतर नहीं है:

if error_check == false 
    error('function:state','Error message'); 
end 

और

assert(error_check==false,'function:state','Error message'); 

एक ही उत्पादन में दोनों परिणाम उपयोगकर्ता को दिखाया , और उसी डेटा को lasterr में संग्रहीत किया जा रहा है। दोनों को try-catch ब्लॉक द्वारा पकड़ा जाता है। एक बहुत तेज़ और गंदे परीक्षण के आधार पर, मैं तात्कालिक रूप से दावा करता हूं कि asserterror से ~ 5% धीमी है (हालांकि यह वास्तव में चीजों की बड़ी योजना में एक बड़ा अंतर नहीं बनाता है)। नतीजतन, कोड का प्रोग्रामर/रखरखाव करने वाला एकमात्र असली अंतर है, जो इसे काफी हद तक स्टाइलिस्ट पसंद बनाता है।

assert और error दोनों उनके पेशेवर और विपक्ष हैं। assert थोड़ा क्लीनर दिखता है और कम जगह लेता है, लेकिन यह स्पष्ट नहीं है कि पहली नज़र में क्या हो रहा है। मेरे व्यक्तिगत उपयोग के लिए, मैं error केस पसंद करूंगा, क्योंकि मैं त्रुटि कॉल के साथ लाइन पर ब्रेकपॉइंट डाल सकता हूं, और अगर त्रुटि फेंकने वाली है तो यह केवल तभी टूट जाएगी - यह आसानी से नहीं किया जा सकता है जोर संदेश के साथ (आप dbstop in file if error का उपयोग कर सकते हैं, लेकिन इसकी संभावित समस्याएं हैं)। त्रुटि को फेंकने से पहले प्रोग्राम स्थिति के बारे में जानकारी प्रिंट करने के लिए मैं if-statement में डिबगिंग कोड भी चिपक सकता हूं।

2

इस मुद्दे के लिए एक और परिप्रेक्ष्य समय चल रहा है। आमतौर पर, आप उम्मीद करते हैं कि आपके कोड त्रुटियों के बिना काम करें। इसका मतलब यह है कि आपको मिलीसेबंड की परवाह नहीं है जो मैटलैब को एक त्रुटि उत्पन्न करने के लिए लेता है, लेकिन केवल तार्किक परीक्षण।

यहाँ कोड मैं तुलना के लिए इस्तेमाल किया है:

for i=1:10000 
o(i,:) = test; 
end 
mean(o) 

और परिणाम:

ans =

function o=test 

a = 2; 
o = [0 0]; 

tic; 
if a~=2 
error('a is not 2') 
end 
o(1) = toc; 


tic 
assert(a==2,'a is not 2') 
o(2) = toc; 
अब

, चलो इस समारोह पर्याप्त बार अच्छा आंकड़े प्राप्त कर सकते चलाते हैं

1.0e-05 *

0,0088 0,3548

लब्बोलुआब यह है:

ज़ोर से अगर-किसी और भी बहुत कुछ धीमी है।

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