2015-03-19 11 views
8

मै मैटलैब से मैक्स फ़ाइल में कोड बदलने के लिए MATLAB कोडर का उपयोग करने का प्रयास कर रहा हूं। अगर मैं निम्नलिखित प्रपत्र की एक कोड का टुकड़ा है:MATLAB में स्थानों की पहचान कैसे करें जहां डेटा को सरणी की सीमाओं के बाहर संग्रहीत किया जाता है?

x = zeros(a,1) 
x(a+1) = 1 

तो मैटलैब में इस सरणी का आकार बदलने, नए घटक को प्रदर्शित करने, जबकि MEX में दायर यह एक "सूचकांक मैट्रिक्स आयामों को पार कर" त्रुटि दे देंगे होगा। मुझे उम्मीद है कि कोड में बहुत सारे स्थान हैं जहां यह हो रहा है।

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

क्या कोई तरीका है यह करने के लिए? क्या MATLAB में कोई भी सेटिंग है जो "आउट-ऑफ-बाउंड इंडेक्स को असाइन करते समय स्वचालित रूप से आकार बदलती है", या अगर ऐसा होता है तो चेतावनी दें?

+0

दिलचस्प सवाल। "_ अगर आप आउट-ऑफ-बाउंड इंडेक्स_ को असाइन करते हैं तो स्वचालित रूप से आकार बदलें" मैटलैब की एक आवश्यक विशेषता है। इस व्यवहार को रोकना मुश्किल लगता है –

+0

क्या आप _single-dimension_, _single-index_ असाइनमेंट में रुचि रखते हैं? यही है, क्या आपके कोड में 'x = zeros (a, 1) x (ए + 1: ए +10) = 1;' कुछ शामिल हो सकता है? या 'x = शून्य (ए, बी) एक्स (ए + 1, बी) = 1;'? –

+0

मैं लगभग यह संभव नहीं कहना चाहता हूं क्योंकि मुझे लगता है कि मैटलैब के कुछ मुख्य टूलबॉक्स इस कार्यक्षमता पर भरोसा करते हैं .... –

उत्तर

2

संपादित करें:

R2015b में, उत्पन्न स्टैंडअलोन पुस्तकालयों और निष्पादनयोग्य का पता लगाने और रिपोर्ट क्रम त्रुटियों ऐसे कर सकते हैं:As of Matlab 2015b, सांकेतिक शब्दों में बदलनेवाला अब रनटाइम त्रुटि एक विकल्प के रूप जाँच (मैटलैब रिलीज नोट्स से) है आउट-ऑफ-बाउंड सरणी इंडेक्सिंग के रूप में। पिछली रिलीज में, केवल जेनरेट किए गए एमएक्स का पता चला और रन-टाइम त्रुटियों की सूचना दी।

डिफ़ॉल्ट रूप से, मेक्स के लिए रन-टाइम त्रुटि पहचान सक्षम है। डिफ़ॉल्ट से, रन-टाइम त्रुटि पहचान स्टैंडअलोन लाइब्रेरी और निष्पादन योग्य के लिए अक्षम है।

स्टैंडअलोन पुस्तकालयों और निष्पादनयोग्य के लिए रन-टाइम त्रुटि का पता लगाने को सक्षम करने के लिए:

कमांड लाइन पर, कोड विन्यास संपत्ति RuntimeChecks का उपयोग करें।

cfg = coder.config ('lib'); % या 'डीएल' या 'exe'

cfg.RuntimeChecks = true;

codegen -config cfg myfunction

MATLAB सांकेतिक शब्दों में बदलनेवाला एप्लिकेशन का उपयोग करना, परियोजना का निर्माण सेटिंग्स में, डिबगिंग टैब पर , उत्पन्न रन-टाइम त्रुटि जाँच बॉक्स की जांच का चयन करें।

जेनरेट किए गए लाइब्रेरीज़ और एक्जिक्यूटिव्स त्रुटि संदेश लिखने के लिए fprintf का उपयोग करते हैं और एप्लिकेशन को समाप्त करने के लिए निरस्त करते हैं। यदि fprintf और abort उपलब्ध नहीं हैं, तो आपको उन्हें प्रदान करना होगा। त्रुटि संदेश अंग्रेजी में हैं।

Run-Time Error Detection and Reporting in Standalone C/C++ Code और Generate Standalone Code That Detects and Reports Run-Time Errors देखें।

मूल जवाब: एक वर्ग डबल से subclassed घोषित जिसमें subsref विधि से बढ़ रहा यह करने के लिए एक अच्छा तरीका होगा अस्वीकृत करने के लिए ओवरलोड हो गया है के बारे में टिप्पणी में जवाब।

ऐसा करने का एक और आसान तरीका यह है कि पूरे कोड (प्रत्येक लूप पुनरावृत्ति या फ़ंक्शन के निचले भाग में) में assert आदेशों को छिड़काव करें ताकि यह आवंटित किया जा सके कि आकार आवंटित आकार में वृद्धि नहीं हुई है।

उदाहरण के लिए, यदि आप का एक प्रारूप में कोड था:

x = zeros(a,1) 
x(a+1) = 1 
... lots of other operations 

if coder.target('MATLAB') 
    assert(isequal(size(x), [a,1]), 'x has been indexed out of bounds') 
end 

यह आप यदि कोई मूल्य सौंपा गया है कि सरणी बढ़ाया दावे विफल डालते हैं जाएगा।

इसे थोड़ा सा बनाने के लिए, आप एक ऐसा फ़ंक्शन भी बना सकते हैं जो आपके द्वारा देखी जाने वाली सभी चरों को चेक करता है, फिर से coder.target को इसके चारों ओर कथन को लपेटकर। फिर आप इसे अपने पूरे कोड में छिड़क सकते हैं।

यह डबल क्लास को अधिभारित करने के रूप में सुरुचिपूर्ण नहीं है, लेकिन दूसरी ओर यह संकलित कोड पर कोई ओवरहेड नहीं जोड़ता है। जब ओवररन होता है तो यह आपको त्रुटियों को बिल्कुल ठीक नहीं करेगा, लेकिन यह आपको विश्वास दिलाएगा कि कोड विभिन्न स्थितियों में अच्छी तरह से काम कर रहा है।

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

t = char(zeros(5,7));    % Allocate a 5 by 7 char array 
tempstring = 'hello to anyone'; % Here's a string we want to put into it. 
t(1, 1:numel(tempstring)) = tempstring; % A valid assignment in MATLAB 

>> size(t) 
ans = 
5 15 

उह ओह, वास्तव में क्या आप के बारे में में सवाल हुआ है चिंतित हैं: t सरणी स्वचालित रूप से काम है, जो MATLAB में काम करता है के दौरान आकार दिया गया है, लेकिन सांकेतिक शब्दों में बदलनेवाला में बनाया गया कोड एक segfault या MEX त्रुटि का कारण बन जाएगा। (। लेकिन छोटा कर दिया) एक वैकल्पिक हम करने के लिए काम में बदलते हैं तो काम सुथरा रखने के लिए end समारोह की शक्ति का उपयोग करने के लिए है:

t(1,1:min(end,numel(tempstring))) = tempstring(1:size(t, 2)); 

t का आकार अपरिवर्तित रहेगा, लेकिन काम काट दिया जाएगा। end का उपयोग असाइनमेंट के दौरान सीमाओं की जांच की अनुमति देता है। कुछ स्थितियों के लिए, यह समस्या को संभालने का एक अच्छा तरीका हो सकता है और आपको विश्वास दिलाएगा कि सीमाएं कभी पार नहीं की जाएंगी, लेकिन जाहिर है कि कुछ परिस्थितियों में यह बहुत अवांछनीय है (और आपको MATLAB में त्रुटि संदेश नहीं देगा।)

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

Editor example with codegen

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

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

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