2012-02-09 9 views
12

He instalado una biblioteca que tiene algunas funciones con el mismo nombre que MATLAB. Y al instalar lib, me refiero a addpath. Cuando intento llamar a esas funciones, usaré la implementación de lib pero quiero llamar a la implementación de MATLAB.¿Es posible llamar a una función que no está en la ruta en MATLAB?

Para simplificar: ¿cómo puedo especificar qué función llamar dado que tengo la dirección absoluta de ambas funciones?

Busqué la respuesta pero no la encontré en el sitio web.

+1

¿Qué tan grande es la biblioteca, y cuánto trabajo vas a hacer con ella? ¿Con qué frecuencia desea llamar a sus funciones desde su código? ¿Hay código OO en la biblioteca? –

Respuesta

10

Si sobrecarga cualquiera de las funciones incorporadas de MATLAB para manejar una clase específica, entonces MATLAB siempre llama a la función sobrecargada en ese tipo. Si, por alguna razón, necesita llamar a la versión incorporada, puede anular el mecanismo de llamada habitual utilizando la función incorporada. La expresión

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

fuerza una llamada a la función incorporada en MATLAB, remodelar, pasando los argumentos se muestra a pesar de que existe una sobrecarga para la clase en esta lista de argumentos.

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

8

uso run, que le permitirá utilizar sus propias funciones en lugar de muebles empotrados sin añadirlos a la ruta.

Tomado de ayuda:

Ejecutar script que no está en camino de la corriente Sintaxis

plazo scriptname

Como dijo correctamente @Cheery, no puede ser utilizado para funciones que aceptan argumentos. Sin embargo, run.m es un archivo modificable, por lo que hice una versión extendida, que puede aceptar argumentos. También se puede modificar para los argumentos de salida con bastante facilidad.

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

es para los SCRIPTS, ¡no para las funciones! ¿Lo intentaste? no podrá proporcionar argumentos de función de esta manera. y el resultado de esta llamada para el archivo de función será algo como esto '??? El argumento de entrada "x" no está definido. Donde "x" es un argumento de la función. – Cheery

+0

Por supuesto. Intente esto - archivo de función 'function y = myfunc (x) (la nueva línea está aquí) y = x; disp (y); 'guárdelo como' myfunc.m' en alguna parte y pruebe 'run path/myfunc.m' en la línea de comandos de Matlab. El resultado será '??? El argumento de entrada "x" no está definido. Matlab tiene dos tipos de archivos: para las funciones y para los scripts. No puede ejecutar el archivo de función directamente desde el editor o la línea de comando. El archivo de función debe estar en la ruta y Matlab intentará localizarlo solo en la llamada. – Cheery

+0

@Cheery, hecho la actualización :) gracias de nuevo. –

2

Otra solución a su pregunta, que me gusta cuando voy a estar llamando a una gran cantidad de las funciones incorporadas en una fila es mover mi biblioteca al final de la ruta de forma temporal.

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) 

Por supuesto, si se utilizan las funciones integradas con más frecuencia que los de Libary, se podía mantener la biblioteca al final de la ruta y moverlo a la parte superior cada vez que lo utilice. Tenga cuidado con su directorio actual, sin embargo, siempre llevará precedence en el orden de ruta.

1

respuesta de Andrey no es lo ideal para mí, pero él y la sugerencia de Loren a "cd al directorio, cree su identificador de función, y luego cd volver" me hizo pensar en lo siguiente:

definir una función que hace lo que describe Loren:

function functionHandle = getFunctionHandleFromFile(fullFileName) 

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

prevDir = pwd; 

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

Luego puede usar eso para obtener el mango. Con el mango, puede invocar la función:

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

Nota para los nuevos usuarios de MATLAB: Recomiendo precaución con este enfoque!Puede ser muy útil en ciertas circunstancias, pero en general me preguntaría si no hay una mejor manera de lidiar con el problema que está tratando de resolver. Esto podría crear más dolores de cabeza de lo que resuelve.

+0

El problema es cuando la función quiere leer/escribir un archivo desde/hasta el directorio de trabajo actual, su método se rompe. –

+0

Véase también la pregunta relacionada http://stackoverflow.com/questions/13072470/call-a-function-that-is-not-on-the-matlab-path-without-adding-that-path/22532918#22532918 y FEX Contribución: http://www.mathworks.com/matlabcentral/fileexchange/45941-constructor-for-functionhandles –

Cuestiones relacionadas