MATLAB

2011-02-06 12 views
33

में वैश्विक चर घोषित करना MATLAB में वैश्विक चर घोषित करने का कोई तरीका है?MATLAB

कृपया के साथ जवाब नहीं है:

global x y z; 

क्योंकि मैं भी the help files पढ़ सकते हैं।

मैं एक वैश्विक चर, x घोषित किया है, और फिर कुछ इस तरह किया:

function[x] = test() 
    global x; 
    test1(); 
end 

कहाँ समारोह test1() के रूप में परिभाषित किया गया है:

function test1() 
    x = 5; 
end 

जब मैं test() चलाने के लिए, मेरी उत्पादन x = [] है। क्या कोई तरीका है कि मैं इसे x=5 आउटपुट कर सकता हूं, या जो भी मैं x को एक अलग फ़ंक्शन में परिभाषित करता हूं? सी में, यह एक बाहरी चर होगा, और मैंने सोचा कि इसे एक वैश्विक चर बनाने के लिए बस इसे पूरा करना चाहिए।

+5

+1 सहायता फ़ाइलों को पढ़ने में सक्षम होने के लिए, कम से कम जब तक यह कहता है: 'हालांकि, यदि कई कार्य, और संभवतः बेस वर्कस्पेस, * सभी * वैश्विक के रूप में एक विशेष नाम घोषित करते हैं, तो वे सभी एक ही प्रति साझा करते हैं वह चर। – Jonas

उत्तर

46

आपको प्रत्येक स्कोप (यानी फ़ंक्शन/वर्कस्पेस) में global variable के रूप में x घोषित करने की आवश्यकता है जिसे आप इसे साझा करना चाहते हैं। तो, आप test1 के रूप में लिखने के लिए की जरूरत है: एक वैश्विक चर का उपयोग कर अपने मुद्दे को हल करने के लिए एक तरीका हो सकता है gnovice की दिशा में अपनी टिप्पणी का जिक्र करते हुए

function test1() 
    global x; 
    x = 5; 
end 
+19

यह सही है। हालांकि, सवाल का जवाब "मुझे भाषा एक्स में ग्लोबल्स का उपयोग करना चाहिए" लगभग हमेशा "नहीं" – KitsuneYMG

+4

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

+0

शायद आप मुझे कुछ सलाह दे सकते हैं। मैंने एक प्रोग्राम लिखा है जो कुछ 'एमएम फाइलों से बना है। कार्यक्रम एक मैट्रिक्स ए को एक इनपुट के रूप में लेता है, फिर इसे एक फ़ंक्शन में पास करता है, यह फ़ंक्शन मैट्रिक्स के लिए कुछ करता है, और इसे किसी अन्य फ़ंक्शन पर भेजता है जो मैट्रिक्स ए के साथ एक और चीज करता है। अंत में, हम मूल मैट्रिक्स पर वापस जाते हैं, यह आउटपुट मैट्रिक्स की जांच करता है, और उसके बाद मैट्रिक्स के साथ कुछ करने के लिए इसे अंतिम कार्य में भेज देता है। मेरी समस्या यह है कि मुझे नहीं लगता कि फ़ंक्शन को फ़ंक्शन से ठीक से पारित किया जा रहा है, इसलिए मैंने सोचा कि मुझे इसे वैश्विक रूप से घोषित करने की आवश्यकता है? – Amit

4

, लेकिन यह एक सामान्य रूप से उपयोग नहीं है।

सबसे पहले सुनिश्चित करें कि आपके .m फ़ाइलों कार्यों और नहीं लिपियों कर रहे हैं। स्क्रिप्ट एक सामान्य वर्कस्पेस साझा करें, जिससे आपके चर को अनिच्छा से ओवरराइट करना आसान हो जाता है। इसके विपरीत, कार्यों का अपना दायरा होता है।

अपने कार्यों के लिए दोहराने योग्य इकाई परीक्षण उत्पन्न करने के लिए xUnit का उपयोग करें। अपने प्रोग्राम में शामिल प्रत्येक फ़ंक्शन का परीक्षण करके आप त्रुटि स्रोत को ट्रैक करेंगे। अपने यूनिट परीक्षण को जगह में रखने के बाद, आगे कोड संशोधन, आसानी से सत्यापित किया जा सकता है।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। आपने जो कहा वह निश्चित रूप से सही है, +1। वैश्विक वर्रों का उपयोग करने के बजाय, अब मैं फ़ंक्शन के रिटर्न वैल्यू का उपयोग करता हूं और जो भी मुख्य फ़ंक्शन में चाहता हूं उसके बराबर सेट करता हूं। यह बहुत बेहतर नरक काम करता है और यह वही है जो मैं शुरुआत में जा रहा था, हालांकि मुझे ऐसे कार्यों को पूरा करने के तरीके के बारे में पता नहीं था। यह अब खूबसूरती से काम करता है, धन्यवाद! – Amit

1

global गड़बड़ के आसपास पाने का एक संभावित तरीका है चर को appdata के रूप में असाइन करना है। MATLAB विंडो से appdata असाइन और पुनर्प्राप्त करने के लिए आप setappdata और getappdata फ़ंक्शंस का उपयोग कर सकते हैं। जब तक MATLAB सत्र सक्रिय होता है तब तक 0 द्वारा निर्दिष्ट विंडो मौजूद होती है।

>> setappdata(0,'x',10) % 0 indicates the root MATLAB window 

अब चर x किसी भी स्क्रिप्ट या समारोह को दिखाई नहीं है, लेकिन जहाँ भी getappdata का उपयोग करके जरूरत पहुँचा जा सकता है।

function test 
    globalX = getappdata(0,'x'); 
    disp(globalX); 
end 

x = 
    10 

अच्छी खबर यह है कि आप, appdata के लिए किसी भी वैध MATLAB वस्तु प्रदान कर सकते हैं बस नाम के साथ सावधान रहना, एक सामान्य x के बजाय ModelOptimizerOptions तरह AppData क्षेत्रों के लिए अद्वितीय नाम का उपयोग, y में मदद मिलेगी है। यह MATLAB उत्पादन सर्वर पर भी संकलित निष्पादित योग्य कोड और कोड पर काम करता है।