MATLAB में, क्या मेरे पास एक स्क्रिप्ट और एक ही फ़ाइल में फ़ंक्शन परिभाषा हो सकती है?


82

मान लीजिए कि मेरे पास एक फ़ंक्शन है f()और मैं इसका उपयोग करना चाहता हूं my_file.m, जो एक स्क्रिप्ट है।

  1. क्या फ़ंक्शन को परिभाषित करना संभव है my_file.m?
  2. यदि नहीं, तो मान लीजिए कि मैंने इसे परिभाषित किया है f.m। मैं इसे कैसे कॉल करूं my_file.m?

मैंने ऑनलाइन प्रलेखन पढ़ा, लेकिन यह स्पष्ट नहीं था कि ऐसा करने का सबसे अच्छा तरीका क्या है।


4
ध्यान दें कि आप ऑक्टेव में स्क्रिप्ट में फ़ंक्शन कर सकते हैं।
यिर्मयाह विलकॉक


बहुत एक पर नज़र रखना करने की सलाह देते stackoverflow.com/questions/17315586/...
URL87

4
असली सवाल यह होना चाहिए: मैथवर्क्स में कौन है जो मुझे इस हास्यास्पद बग को ठीक करने के लिए शिकायत करता है?
सूतक

3
MATLAB 2016 बी के अनुसार, फ़ंक्शंस को स्क्रिप्ट में परिभाषित किया जा सकता है। मुझे यकीन नहीं है कि इस काफी बुनियादी सुविधा को जोड़ने के लिए उन्होंने 32 साल इंतजार क्यों किया।
onewhaleid

जवाबों:


49

R2016b को रिलीज़ करने के बाद, आप लिपियों में स्थानीय कार्य कर सकते हैं , जैसे:

data = 1:10;            % A vector of data
squaredData = f(data);  % Invoke the local function

function y = f(x)
  y = x.^2;
end

R2016b को जारी करने से पहले, केवल एक प्रकार का फ़ंक्शन जिसे MATLAB स्क्रिप्ट के अंदर परिभाषित किया जा सकता था, एक अनाम फ़ंक्शन था । उदाहरण के लिए:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

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


37

जिस तरह से मुझे इस सीमा के आसपास मिलता है, मेरी स्क्रिप्ट को उन कार्यों में बदलना है जो कोई तर्क नहीं लेते हैं (यदि मुझे वैश्विक नामस्थान से चर की आवश्यकता है, मैं या तो उन्हें फ़ंक्शन में स्पष्ट रूप से पास करता हूं, या उन्हें हथियाने के लिए "एवलिन" का उपयोग करता हूं।)

फिर आप "स्क्रिप्ट" में आवश्यक सभी अतिरिक्त कार्यों को परिभाषित कर सकते हैं। यह एक हैक है, लेकिन मैंने इसे उन मामलों में काफी शक्तिशाली पाया है जहां मुझे कई गैर-तुच्छ कार्यों की आवश्यकता है।

संपादित करें: यहाँ एक सरल उदाहरण है। यह सब एक ही फाइल में रहता है।

function [] = myScriptAsAFunction()
   img = randn(200);
   img = smooth(img);
   figure(1);
   imagesc(img);
   axis image;
   colorbar;
end

function simg = smooth(img)
    simg = img / 5;
end

6
+1, यह वास्तव में मुझे गुस्सा दिलाता है जब मैं सभी स्पष्ट देखता हूं; सब बंद करें; एक मैटलैब स्क्रिप्ट के शीर्ष पर। यदि आपके पास इतने सारे चर और भूखंड हैं, जो आपके आस-पास तैर रहे हैं, तो आप उन पर नज़र नहीं रख सकते हैं जो आप पर्याप्त कार्यों का उपयोग नहीं कर रहे हैं।
बी रीको

1
क्या आप इस "हैक" के एक नमूना कार्यान्वयन को शामिल कर सकते हैं? मुझे यह पता नहीं लग सकता है कि यह कैसे काम करता है।
जेम्स टेलर

1
इस दृष्टिकोण के साथ एक समस्या नोट करें कि फ़ंक्शन के बाहर निकलने पर चर कभी भी इसे आपके कार्यक्षेत्र में नहीं बनाते हैं। यदि आप स्क्रिप्ट के अंत में उन चरों को खेलना / देखना / उपयोग करना चाहते हैं तो यह एक समस्या हो सकती है।
चेसोफर्नेड

1
@chessofnerd जब मुझे समस्या होती है, मैं या तो फ़ंक्शन आउटपुट में चर लौटाता हूं, या मैं असाइनिन का उपयोग करता हूं।
जॉन

1
@ जॉन, मुझे व्यक्तिगत रूप से लगता है कि सभी चर को व्यक्तिगत रूप से वापस करने के लिए एक दर्द का एक सा है, क्योंकि उन्हें अपने दम पर काम करने की जगह में दिखाने का विरोध किया गया है। उस ने कहा, मैंने कभी नहीं सुना था assignin। यह एक साफ काम है जिसका मैं और अधिक उपयोग कर सकता हूं!
चेसोफर्नेड

19

आप ऐसा कुछ कर सकते हैं (यह मानते हुए कि आपकी फ़ाइल का नाम है my_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

यदि आप रन बटन पर क्लिक करते हैं, तो फ़ंक्शन my_fileडिफ़ॉल्ट रूप से निष्पादित किया जाएगा।


2
क्या यह जॉन के जवाब से अलग है?
sancho.s ReinstateMonicaCellio

7

1) आप किसी स्क्रिप्ट के अंदर फंक्शन को घोंसला नहीं दे सकते।

2) सुनिश्चित करें कि fm आपके पथ पर या वर्तमान निर्देशिका में है, और आप इसे किसी अन्य फ़ंक्शन की तरह कॉल कर सकते हैं।


यदि आप @Oneiros द्वारा प्रस्तावित किया जाता है, तो आप एक स्क्रिप्ट के अंदर एक फ़ंक्शन को घोंसला बना सकते हैं। आप fअपने स्क्रिप्ट के भीतर ( अपने उदाहरण में) अपने फ़ंक्शन ( उसके उदाहरण में) को भी कॉल कर सकते हैं my_file
मार्सेलोक्रा


3

मैंने जॉन द्वारा समाधान लागू किया है , और मुझे यह उपयोगी लगा। लेकिन कुछ जोड़े हैं (ऑक्टेव में; मतलब संभवतः इसी तरह का व्यवहार करता है):

  1. यदि आपके मुख्य फ़ंक्शन के अंदर कोड clear allमें सहायक फ़ंक्शन का उपयोग करने से पहले होता है , तो यह काम नहीं करेगा। फ़ाइल में test3.m, टिप्पणी करना / असहज करना clear allकोड काम / काम नहीं करता है।

    function [] = test3()
      %clear all
      a = myfunc( 1 );
      a
    endfunction;
    
    %---------------------------------
    % Auxiliary functions
    
    function retval = myfunc( a )
      retval = 2 * a;
    endfunction;
    

    ऐसा लगता है कि किसी स्क्रिप्ट को चलाने पर, एक पहला पास है जहां बाहर के कार्यों को कोड निष्पादित किया जाता है (इस मामले में, ऐसा कोई कोड नहीं है), और परिभाषित कार्य (इस मामले में, test3और myfunc) कार्यक्षेत्र में जोड़े जाते हैं। एक दूसरा पास मुख्य फ़ंक्शन को निष्पादित करेगा, जो यह नहीं पाएगा myfuncकि clear allक्या सक्रिय है।

  2. जैसा कि chessofnerd द्वारा बताया गया है, आपके मुख्य कार्य में चर बाहर-बाहर कार्यक्षेत्र में नहीं जाते हैं।


2

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

हालांकि, उत्तर खोजने का सबसे सरल तरीका एक कोशिश है ~

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.