2012-10-25 8 views
11

Ho cercato un intero pomeriggio e non ho trovato alcuna soluzione per chiamare in MATLAB una funzione specificandone il percorso e non aggiungendo la sua directory al percorso.Chiama una funzione che non si trova nel percorso Matlab SENZA AGGIUNGERE QUESTO PERCORSO

Questa domanda è molto simile a Is it possible to call a function that is not in the path in MATLAB?, ma nel mio caso, non voglio chiamare una funzione built-in, ma solo una funzione normale come definito in un m-file.

Penso maniglie potrebbe essere una soluzione (perché a quanto pare si può fare riferimento a funzioni non sulla strada), ma ancora una volta ho trovato alcun modo per creare una maniglia, senza cd -ing alla directory, creando lì e la cd - indietro. Cercando di "esplorare" cosa sia una funzione che gestisce l'oggetto e come crearne uno con un riferimento a una funzione specifica non sul percorso non mi ha portato da nessuna parte.

Quindi la soluzione potrebbe venire da due angoli:
1) Si sa come creare un handle per un m-file in una directory specifica.
2) Si conosce un modo per chiamare una funzione non sul percorso MATLAB.

MODIFICA: ho appena scoperto la funzione functions(myhandle) che in realtà consente di visualizzare il percorso file a cui si riferisce l'handle. Ma non c'è ancora modo di modificarlo ...

+0

FWIW, il comando 'feval', che è il posto più naturale per questa funzionalità, esclude specificatamente la specifica della directory. "Il parametro' fname' deve essere un semplice nome di funzione, non può contenere informazioni sul percorso. " –

+1

Proprio come un interesse generale: ti ricordi * perché * non volevi mettere la directory sul tuo percorso? –

+0

@RodyOldenhuis In azienda lavoro, lavoriamo con diversi utenti sullo stesso server con RDP con un instal matlab (quindi un matlabrc, un percorso, ecc.) Gli utenti non sono generalmente attenti con il percorso e lo macellano costantemente. Molti utenti chiamano le loro funzioni in modo errato e ombreggiano a volte anche le funzioni MATLAB di base, quindi aggiungono la loro cartella al percorso. Vedo codice dappertutto con 'removepath (...); function(); addpath (...)' e simili ... Si interrompe se 2 utenti lo fanno allo stesso tempo. Quindi la soluzione più semplice sarebbe quella di poter chiamare direttamente una funzione specifica senza preoccuparsi del percorso –

risposta

1

Il comando run può eseguire un file di script da qualsiasi directory, ma non può chiamare una funzione (con argomenti di input e output).

fevalstr2func consentono informazioni sulla directory nella stringa di funzioni.

Suggerisco scrivere il proprio wrapper per str2func che:

  • salva la directory di lavoro
  • modifiche alla directory nella directory dello script
  • crea gestire una funzione
  • ripristina la directory di lavoro originale

Attenzione, tuttavia, che un handle per una funzione non in t È probabile che il percorso si interrompa, poiché la funzione non sarà in grado di richiamare alcun codice di aiuto memorizzato in altri file nella sua directory.

+0

Grazie per la risposta. Conosco già il comando 'run' ed effettivamente è qualcosa di cui ho bisogno, ma per funzioni invece di script. Ho chiamato l'assistenza tecnica MATLAB e non esiste una soluzione integrata di questo tipo. –

9

Questo è fattibile, ma richiede un po 'di analisi e una chiamata a evalin.

ho aggiunto (molti anni fa!) Una funzione al MATLAB Central File Exchange chiamato externalFcn

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

che gestisce chiamate a funzioni off-path. Ad esempio, ho una funzione chiamata offpathFcn che restituisce semplicemente una struttura con un messaggio di successo e il valore di un input.Memorizzazione di quella funzione il mio percorso MATLAB, mi può chiamare utilizzando:

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

Ciò restituisce:

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

(Si noti che la mia implementazione è limitata, e migliorabile, è necessario includere un'uscita con una segno di uguale per far funzionare tutto questo. Ma dovrebbe mostrare come ottenere ciò che si desidera.)

(Application engineer MathWorks)

+2

Grazie per la risposta. Sì, ho trovato 'externalfcn' durante la ricerca di una soluzione, ma questo in effetti' cd's nella directory e 'cd's back. Questo è inaccettabilmente lento per i miei scopi. L'unica soluzione che ho trovato ora è di creare un handle con 'cd'ing e' cd'ing back ... Una volta ottenuto l'handle, le chiamate di funzione sono veloci. –

+0

@reverse_engineer: Se hai trovato un metodo migliore come le maniglie, potresti postare come risposta? Avrai il mio +1. – strpeter

+2

@strpeter No, la soluzione che ho usato alla fine è stata quella di 'cd' nella directory, creare un handle qui, e' cd'-ing back. Quindi l'handle si riferisce ancora alla funzione nella cartella specifica che non è sul percorso e che è possibile chiamare questo handle. Ma non ho trovato alcun modo per chiamare una funzione non sul percorso con nessun altro metodo ... –

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

Potresti fornire qualche spiegazione? – Undo

+0

Grazie per la tua risposta, ma questo implica 'cd'-ing nella directory delle funzioni, che avrei voluto evitare ... –

+0

Non so in nessun altro modo: Matlab ha bisogno di sapere la funzione che intendi. Per quanto ne so, ci sono solo due possibilità: o si trova nel percorso Matlab o nella directory corrente. –

2

Ho modificato il codice di Thierry Dalon per evitare l'uso di feval, con cui mi sento sempre a disagio. Nota che questo non aggira il cd nella directory in questione, ma, succede dietro le quinte, quindi fai finta che non accada :-) Nota anche ciò che Ben Voigt ha sottolineato sopra: chiamate alle funzioni di supporto fuori dal sentiero fallirà.

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 

e chiamando sarebbe simile

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

in che modo questa risposta è diversa da [quella di Dalon] (http://stackoverflow.com/a/16903404/1714410)? non dup le risposte ... – Shai

Problemi correlati