2012-02-09 20 views
12

मैंने एक लाइब्रेरी स्थापित की है जिसमें MATLAB के समान नाम वाले कुछ फ़ंक्शन हैं। और lib स्थापित करके, मेरा मतलब addpath है। जब मैं उन फ़ंक्शन को कॉल करने का प्रयास करता हूं तो वह उस lib के कार्यान्वयन का उपयोग करेगा लेकिन मैं MATLAB कार्यान्वयन को कॉल करना चाहता हूं।क्या ऐसा फ़ंक्शन कॉल करना संभव है जो MATLAB में पथ में नहीं है?

इसे आसान बनाने के लिए: मैं यह निर्दिष्ट कैसे कर सकता हूं कि कॉल करने के लिए कौन सा फ़ंक्शन दिया गया है कि मेरे पास दोनों कार्यों का पूर्ण पता है?

मैंने उत्तर की खोज की लेकिन मुझे इसे वेबसाइट पर नहीं मिला।

+1

पुस्तकालय कितना बड़ा है, और आप इसके साथ कितना काम करने जा रहे हैं? आप अपने कार्यों से कितनी बार कॉल करना चाहते हैं? पुस्तकालय में ओओ कोड है? –

उत्तर

10

यदि आप किसी विशिष्ट वर्ग को संभालने के लिए किसी भी MATLAB अंतर्निहित फ़ंक्शंस को अधिभारित करते हैं, तो MATLAB हमेशा उस प्रकार पर ओवरलोडेड फ़ंक्शन को कॉल करता है। यदि, किसी कारण से, आपको अंतर्निहित संस्करण को कॉल करने की आवश्यकता है, तो आप बिल्टिन फ़ंक्शन का उपयोग करके सामान्य कॉलिंग तंत्र को ओवरराइड कर सकते हैं। अभिव्यक्ति

builtin('reshape', arg1, arg2, ..., argN); 

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

http://www.mathworks.com/help/techdoc/matlab_prog/br65lhj-1.html

8

उपयोग run, यह आप अपने खुद के कार्यों के लिए उन्हें पथ को जोड़ने बिना बनाया-इन के बजाय का उपयोग करने की अनुमति देगा।

मदद से लिया:

स्क्रिप्ट चलाएं कि वर्तमान पथ पर नहीं है सिंटेक्स

रन SCRIPTNAME स्क्रिप्ट

@Cheery के रूप में सही ढंग से कहा, यह काम करता है कि स्वीकार करने के लिए नहीं किया जा सकता तर्क। हालांकि, run.m संशोधित फ़ाइल है, इसलिए मैंने एक विस्तारित संस्करण बनाया है, जो तर्क स्वीकार कर सकता है। इसे आउटपुट तर्कों के साथ-साथ आसानी से संशोधित किया जा सकता है।

function runExtended(script,varargin) 

    cur = cd; 

    if isempty(script), return, end 
    if ispc, script(script=='/')='\'; end 
    [p,s,ext] = fileparts(script); 
    if ~isempty(p), 
     if exist(p,'dir'), 
      cd(p) 
      w = which(s); 
      if ~isempty(w), 
       % Check to make sure everything matches 
       [wp,ws,wext] = fileparts(w); 
       % Allow users to choose the .m file and run a .p 
       if strcmp(wext,'.p') && strcmp(ext,'.m'), 
        wext = '.m'; 
       end 

       if ispc 
        cont = ~strcmpi(wp,pwd) | ~strcmpi(ws,s) | ... 
         (~isempty(ext) & ~strcmpi(wext,ext)); 
       else 
        cont = ~isequal(wp,pwd) | ~isequal(ws,s) | ... 
         (~isempty(ext) & ~isequal(wext,ext)); 
       end 
       if cont 
        if exist([s ext],'file') 
         cd(cur) 
         rehash; 
         error('MATLAB:run:CannotExecute','Can''t run %s.',[s ext]); 
        else 
         cd(cur) 
         rehash; 
         error('MATLAB:run:FileNotFound','Can''t find %s.',[s ext]); 
        end 
       end 
       try 
        feval(s,varargin{:}); 
        %   evalin('caller', [s ';']); 
       catch e 
        cd(cur); 
        rethrow(e); 
       end 
      else 
       cd(cur) 
       rehash; 
       error('MATLAB:run:FileNotFound','%s not found.',script) 
      end 
      cd(cur) 
      rehash; 
     else 
      error('MATLAB:run:FileNotFound','%s not found.',script) 
     end 
    else 
     if exist(script,'file') 
      evalin('caller',[script ';']); 
     else 
      error('MATLAB:run:FileNotFound','%s not found.',script) 
     end 
    end 

end 
+1

यह एससीआरआईपीटीएस के लिए है, कार्यों के लिए नहीं! क्या तुमने कोशिश की? आप इस तरह फ़ंक्शन तर्क प्रदान करने में सक्षम नहीं होंगे। और फ़ंक्शन फ़ाइल के लिए इस कॉल का परिणाम कुछ ऐसा होगा ??? ??? इनपुट तर्क "एक्स" अपरिभाषित है। 'जहां "x" फ़ंक्शन का तर्क है। – Cheery

+0

बेशक। इसे आज़माएं - फ़ंक्शन फ़ाइल 'फ़ंक्शन y = myfunc (x) (नई पंक्ति यहां है) y = x; disp (y); 'इसे कहीं भी myfunc.m' के रूप में सहेजें और Matlab की कमांड लाइन में' पथ/myfunc.m 'चलाने का प्रयास करें। नतीजा होगा ??? इनपुट तर्क "एक्स" अपरिभाषित है। 'मैटलैब में दो प्रकार की फाइलें हैं - फ़ंक्शंस के लिए और स्क्रिप्ट के लिए। आप सीधे संपादक या कमांड लाइन से फ़ंक्शन फ़ाइल नहीं चला सकते हैं। फ़ंक्शन फ़ाइल पथ में होनी चाहिए और मैटलैब कॉल पर स्वयं को ढूंढने का प्रयास करेगा। – Cheery

+0

@ चेरी, अद्यतन किया :) धन्यवाद फिर से। –

2

अपने प्रश्न का एक अन्य समाधान है जो मुझे पसंद है जब मैं अस्थायी रूप से पथ के अंत करने के लिए अपने पुस्तकालय को स्थानांतरित करने के लिए एक पंक्ति में बिल्ट-इन कार्य का एक बहुत बुला हो जाएगा है।

libpath = '/home/user/mylib'; 
% move mylib to the end of the path 
addpath(libpath, '-end'); 
% now call some built-in functions that mylib overwrites 
reshape(rand(100),10,10); 
% return mylib to the top 
addpath(libpath) 
बेशक

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

1

एंड्री का जवाब मेरे लिए आदर्श नहीं है, लेकिन यह और लोरेन के सुझाव के लिए "निर्देशिका के लिए सीडी, बनाने अपने कार्य संभाल, और फिर वापस सीडी" मेरा पीछा कर के बारे में सोच कर दिया:

एक समारोह को परिभाषित करें कि क्या लॉरेन का वर्णन करता है:

function functionHandle = getFunctionHandleFromFile(fullFileName) 

[pathstr, name, ext] = fileparts(fullFileName); 

prevDir = pwd; 

cd(pathstr); 
functionHandle = str2func(name); 
cd(prevDir); 

फिर आप इसे संभालने के लिए उपयोग कर सकते हैं। नए MATLAB उपयोगकर्ताओं के

nameOf = getFunctionHandleFromFile('/Users/sage/matlab-utilities/nameOf.m') 
nameOf(output) 

नोट:: संभाल के साथ, आप समारोह आह्वान कर सकते हैं मैं इस दृष्टिकोण के साथ सावधानी सलाह देते हैं!यह कुछ परिस्थितियों में बहुत उपयोगी हो सकता है, लेकिन आम तौर पर मैं खुद से पूछूंगा कि क्या समस्या का समाधान करने का कोई बेहतर तरीका नहीं है जिसे आप हल करने की कोशिश कर रहे हैं। यह हल होने से अधिक सिरदर्द पैदा कर सकता है।

+0

समस्या तब होती है जब फ़ंक्शन वर्तमान कार्य निर्देशिका से/फ़ाइल को पढ़ने/लिखना चाहता है, तो आपकी विधि टूट जाती है। –

+0

संबंधित प्रश्न भी देखें http://stackoverflow.com/questions/13072470/call-a-function-that-is-not-on-the-matlab-path-without-adding-that-path/22532918#22532918 और FEX योगदान: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for- कार्यक्षमता –

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