2012-10-25 36 views
11

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

यह प्रश्न Is it possible to call a function that is not in the path in MATLAB? के समान है, लेकिन मेरे मामले में, मैं एक अंतर्निहित फ़ंक्शन को कॉल नहीं करना चाहता हूं, लेकिन एम-फाइल में परिभाषित एक सामान्य कार्य है।

मुझे लगता है कि हैंडल एक समाधान हो सकता है (क्योंकि जाहिरा तौर पर वे रास्ते पर नहीं कार्यों का उल्लेख कर सकते हैं), लेकिन मैं फिर से cd निर्देशिका के लिए आईएनजी के बिना एक हैंडल बनाने के लिए कोई रास्ता नहीं मिला, वहाँ cd इसे बनाने और - वापस आईएनजी एक फंक्शन हैंडल ऑब्जेक्ट क्या है 'एक्सप्लोर' करने का प्रयास कर रहा है और पथ पर नहीं, किसी विशिष्ट फ़ंक्शन के संदर्भ में एक को कैसे बनाया जाए, मुझे कहीं भी नहीं मिला है।

तो समाधान दो कोणों से आ सकता है:
1) आप जानते हैं कि एक विशिष्ट निर्देशिका में एम-फाइल के लिए हैंडल कैसे बनाएं।
2) आप मैटलैब पथ पर फ़ंक्शन को कॉल करने का कोई तरीका नहीं जानते हैं।

संपादित करें: मैंने अभी functions(myhandle) फ़ंक्शन की खोज की है जो वास्तव में आपको फ़ाइलपैथ को देखने देता है जिस पर हैंडल संदर्भ दे रहा है। लेकिन अभी भी इसे संशोधित करने का कोई तरीका नहीं है ...

+0

एफडब्ल्यूआईडब्ल्यू, 'feval' कमांड, जो इस क्षमता के लिए सबसे प्राकृतिक स्थान है, विशेष रूप से निर्देशिका निर्दिष्ट करने को छोड़ देता है। "'Fname' पैरामीटर एक साधारण फ़ंक्शन नाम होना चाहिए; इसमें पथ जानकारी नहीं हो सकती है।" –

+1

बस एक सामान्य रुचि के रूप में: क्या आपको याद है * क्यों * आप निर्देशिका को अपने रास्ते पर नहीं रखना चाहते थे? –

+0

@RodyOldenhuis मैं जिस कंपनी में काम करता हूं, हम आरडीपी के साथ एक ही सर्वर पर कई उपयोगकर्ताओं के साथ काम करते हैं, जिसमें एक मैटलैब इंस्टाल (इस प्रकार एक मैटलबैक, एक पथ इत्यादि) उपयोगकर्ता आमतौर पर पथ से सावधान नहीं होते हैं और इसे लगातार दबाते हैं। कई उपयोगकर्ता अपने कार्यों को गलत तरीके से नाम देते हैं और कभी-कभी कोर मैटलैब फ़ंक्शंस भी छाया करते हैं, फिर पथ में अपना फ़ोल्डर जोड़ते हैं। मैं 'removepath (...); function(); addpath (...) 'और जैसे ... के साथ हर जगह कोड देखता हूं ... यदि 2 उपयोगकर्ता एक ही समय में ऐसा करते हैं तो यह टूट जाता है। तो सबसे आसान समाधान पथ के बारे में चिंता किए बिना सीधे एक विशिष्ट कार्य को कॉल करने में सक्षम होना चाहिए –

उत्तर

5

समाधान लगेगा के रूप में टिप्पणी 1 में नोट एक समारोह संभाल बनाने के लिए पहले समारोह बुला अच्छी तरह से @Rody Oldenhuis 'FEX अंशदान द्वारा कार्यान्वित किया जाता: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles

+0

अन्य सभी कार्यान्वयन के समान ही 'सीडी' का उपयोग करता है? – Argyll

1

run कमांड किसी भी निर्देशिका से एक स्क्रिप्ट फ़ाइल चला सकता है, लेकिन यह एक फ़ंक्शन (इनपुट और आउटपुट तर्क के साथ) को कॉल नहीं कर सकता है।

न तो feval और न ही str2func फ़ंक्शन स्ट्रिंग में निर्देशिका निर्देशिका की अनुमति दें।

मैं str2func के लिए अपने स्वयं के आवरण लेखन कि सुझाव देते हैं:

  • कार्यशील निर्देशिका
  • स्क्रिप्ट निर्देशिका के लिए निर्देशिका में परिवर्तन
  • एक समारोह
  • संभाल बनाता है बचाता मूल कार्यशील निर्देशिका पुनर्स्थापित करता

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

+0

आपके उत्तर के लिए धन्यवाद। मुझे पहले से ही 'रन' कमांड पता है और वास्तव में ऐसा कुछ है जो मुझे चाहिए, लेकिन स्क्रिप्ट के बजाय कार्यों के लिए। मैंने मैटलैब तकनीकी सहायता कहा और ऐसा कोई अंतर्निहित समाधान नहीं है। –

9

यह करने योग्य है, लेकिन थोड़ा सा पार्सिंग की आवश्यकता है, और evalin पर कॉल करने की आवश्यकता है।

मैं (कई साल पहले!) जोड़ा MATLAB केंद्रीय करने के लिए एक समारोह फ़ाइल एक्सचेंज externalFcn

http://www.mathworks.com/matlabcentral/fileexchange/4361-externalfcn

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

externalfcn('out = C:\MFILES_OffPath\offpathFcn(''this is a test'')'); 

यह रिटर्न:

out = 
    success: 1 
    input: 'this is a test' 

(नोट मेरी कार्यान्वयन सीमित है कि, और improvable, तुम एक साथ एक निर्गम शामिल करने की आवश्यकता इस के लिए बराबर के चिह्न काम करने के लिए। लेकिन इसे हासिल करने के लिए कैसे आप क्या चाहते हैं आप दिखाना चाहिए।)

(Mathworks आवेदन इंजीनियर)

+2

आपके उत्तर के लिए धन्यवाद। हां, मुझे समाधान खोजने के दौरान 'externalfcn' मिला, लेकिन यह वास्तव में निर्देशिका के लिए' cd 'और' cd's back 'है। यह मेरे उद्देश्यों के लिए अस्वीकार्य रूप से धीमा है। अब मुझे मिला एकमात्र समाधान 'सीडी'इंग और' सीडी 'द्वारा एक हैंडल बनाना है ... एक बार आपके पास हैंडल होने के बाद, फ़ंक्शन कॉल त्वरित होते हैं। –

+0

@reverse_engineer: यदि आप हैंडल जैसी एक बेहतर विधि के साथ आए हैं, तो क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं? आपके पास मेरा +1 होगा। – strpeter

+2

@strpeter नहीं, अंत में उपयोग किया जाने वाला समाधान निर्देशिका में 'सीडी' था, वहां एक हैंडल बना रहा था, और' cd'-ing वापस। फिर हैंडल अभी भी उस विशिष्ट फ़ोल्डर में फ़ंक्शन को संदर्भित करता है जो पथ पर नहीं है, और आप इस हैंडल को कॉल कर सकते हैं। लेकिन मुझे किसी अन्य विधि के साथ पथ पर नहीं फ़ंक्शन कॉल करने का कोई तरीका नहीं मिला है ... –

3
function [varargout]=funeval(fun,varargin) 
% INPUT: 
% fun: (char) full path to function file 
curdir=cd; 
[fundir,funname]=fileparts(fun); 
cd(fundir); 
[varargout{1:nargout}] =feval(funname,varargin{:}) 
cd(curdir); 
+0

क्या आप कुछ स्पष्टीकरण प्रदान कर सकते हैं? – Undo

+0

आपके उत्तर के लिए धन्यवाद, लेकिन यह फ़ंक्शन निर्देशिका में 'cd'-ing का तात्पर्य है, जिसे मैं टालना पसंद करूंगा ... –

+0

मुझे कोई अन्य तरीका नहीं पता: Matlab को आपके द्वारा किए गए फ़ंक्शन को जानने की आवश्यकता है। इसके लिए, जहां तक ​​मुझे पता है कि केवल दो संभावनाएं हैं: या तो यह मैटलैब पथ या वर्तमान निर्देशिका में है। –

2

मैंने फेवर के उपयोग से बचने के लिए थियरी डेलन के कोड को संशोधित किया है, जिसे मैं हमेशा असहज महसूस करता हूं। ध्यान दें कि यह अभी भी निर्देशिका में सीडी-आईएनजी के आसपास नहीं मिलता है, लेकिन ठीक है, यह दृश्यों के पीछे होता है, इसलिए दिखाएं कि ऐसा नहीं होता है :-) यह भी ध्यान दें कि बेन वोगेट ने ऊपर क्या बताया: सहायक कार्यों पर कॉल पथ से बाहर असफल हो जाएगा।

function [varargout]=funeval(FunctionHandle, FunctionPath, varargin) 
% INPUT: 
% FunctionHandle: handle to the function to be called; eg @MyFunction 
% FunctionPath: the path to that function 
% varargin: the arguments to be passed to Myfunction 
curdir=cd; 
cd(FunctionPath) 
[varargout{1:nargout}] = FunctionHandle(varargin{:}); 
cd(curdir); 
end 

और बुला ऐसा

Output = funeval(@MyFunction, 'c:\SomeDirOffMatlabsPath\', InputArgToMyFunc) 
+0

यह उत्तर [डलोन की एक] से अलग है (http://stackoverflow.com/a/16903404/1714410)? उत्तर डुप्लिकेट न करें ... – Shai