2012-02-09 17 views
12

Ho installato una libreria che ha alcune funzioni con lo stesso nome di MATLAB. E installando la lib, intendo addpath. Quando provo a chiamare quelle funzioni, utilizzerò l'implementazione di lib, ma voglio chiamare l'implementazione di MATLAB.È possibile chiamare una funzione che non si trova nel percorso in MATLAB?

Per semplificare: come specificare quale funzione chiamare dato che ho l'indirizzo assoluto di entrambe le funzioni?

Ho cercato la risposta ma non l'ho trovata sul sito web.

+1

Quanto è grande la libreria e quanto lavoro si intende fare con esso? Quante volte vuoi chiamare le sue funzioni dal tuo codice? C'è un codice OO nella libreria? –

risposta

10

Se si sovraccaricano le funzioni incorporate di MATLAB per gestire una classe specifica, MATLAB chiama sempre la funzione di sovraccarico su quel tipo. Se, per qualche motivo, è necessario chiamare la versione integrata, è possibile ignorare il normale meccanismo di chiamata utilizzando la funzione incorporata. L'espressione

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

costringe una chiamata alla funzione built-in MATLAB, rimodellare, passando gli argomenti mostrato, anche se esiste un sovraccarico per la classe in questo elenco di argomenti.

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

8

uso run, che vi permetterà di utilizzare le proprie funzioni, invece di built-in senza aggiungendoli al percorso.

Tratto da aiuto:

Esegui script che non si trova sul percorso corrente Sintassi

corsa nomescript

Come ha detto giustamente @Cheery, non può essere utilizzato per le funzioni che accettano argomenti. Tuttavia, run.m è un file modificabile, quindi ho creato una versione estesa, che può accettare argomenti. Può essere modificato anche per argomenti di output abbastanza facilmente.

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

è per gli SCRIPTS, non per le funzioni! Hai provato? non sarai in grado di fornire argomenti di funzione in questo modo. e il risultato di questa chiamata per il file di funzione sarà qualcosa come questo ??? L'argomento di input "x" non è definito. Dove "x" è un argomento della funzione. – Cheery

+0

Ovviamente. Prova questo - function file 'function y = myfunc (x) (la nuova riga è qui) y = x; disp (y); 'salvalo come' myfunc.m' da qualche parte e prova 'run path/myfunc.m' nella riga di comando di Matlab. Il risultato sarà '??? L'argomento di input "x" non è definito. Matlab ha due tipi di file: per le funzioni e per gli script. Non è possibile eseguire il file di funzione direttamente dall'editor o dalla riga di comando. Il file di funzione dovrebbe essere nel percorso e Matlab proverà a localizzarlo da solo alla chiamata. – Cheery

+0

@Cheery, fatto aggiornamento :) grazie ancora. –

2

Un'altra soluzione alla tua domanda che mi piace quando sarò chiamando un sacco di funzioni incorporate in una fila è quello di spostare la mia libreria alla fine del percorso temporaneo.

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) 

Naturalmente se si utilizzano le funzioni built-nel più delle volte i vostri libary di, si potrebbe mantenere la libreria alla fine del percorso e spostarlo verso l'alto ogni volta che lo si utilizza. Prestare attenzione alla directory corrente, tuttavia, sarà sempre necessario precedence per l'ordine del percorso.

1

risposta di Andrey non è l'ideale per me, ma e suggerimento di Loren per "cd alla directory, creare vostra maniglia funzione, e poi cd indietro" mi ha fatto pensare di quanto segue:

definire una funzione che fa quello che descrive Loren:

function functionHandle = getFunctionHandleFromFile(fullFileName) 

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

prevDir = pwd; 

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

Quindi è sufficiente usarlo per ottenere la maniglia. Con la maniglia, è possibile richiamare la funzione:

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

Nota per nuovi utenti MATLAB: vi consiglio cautela con questo approccio!Può essere molto utile in determinate circostanze, ma in generale mi chiedo se non c'è un modo migliore per affrontare il problema che stai cercando di risolvere. Questo potrebbe creare più mal di testa di quello che risolve.

+0

Il problema è quando la funzione vuole leggere/scrivere un file da/alla directory di lavoro corrente, il metodo si interrompe. –

+0

Vedere anche la domanda correlata http://stackoverflow.com/questions/13072470/call-a-function-that-is-not-on-the-matlab-path-without-adding-that-path/22532918#22532918 e FEX Contributo: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles –

Problemi correlati