2011-06-11 31 views
13

Soy bastante nuevo en Matlab. Definí una función dentro de un archivo .m, quiero usar esa función en ese archivo .m dentro de otro archivo .m y quiero ejecutar el contenido de ese último archivo .m desde la ventana de comandos.Usar Matlab para importar otro archivo .m

¿Cómo debo hacer esto?

EDITAR - de aclaración, que tiene una función dentro aa.m, y una secuencia de comandos en el interior b.m que utiliza la función a dentro a.m. Me gustaría ejecutar este script dentro de b.m desde la ventana de comandos, pero no estoy seguro de cómo hacerlo. (Como nota al margen, que puede convertir totalmente el guión en b.m en una función si es necesario)

EDITAR - ahora sólo necesita saber cómo importar/cargar un archivo de MATLAB y eso es todo !! !

+0

Muy relacionado: [¿Es posible definir más de una función por archivo en MATLAB?] (Http://stackoverflow.com/q/3569933/52738) – gnovice

+0

@gnovice - gracias, pero desafortunadamente no deseo aún para definir más de una función en un archivo. Lamento que la pregunta no fuera lo suficientemente clara. – wrongusername

Respuesta

12

En principio, MATLAB recomienda el uso de una función por archivo .m. Puede llamar a dicha función desde otro archivo .m y desde la línea de comando de MATLAB.

Puede definir múltiples funciones en un solo archivo .m, pero solo se puede acceder a la primera (o "más externa") función desde otros archivos .m o desde la línea de comandos. Las otras funciones se tratan como funciones 'auxiliares' que pueden llamarse solo dentro de este archivo particular .m.

+0

Hola nimrodm, ¿cómo podría "llamar a esa función desde otro archivo .m"? Eso es todo lo que necesito saber para responder a esta pregunta, ¡gracias! – wrongusername

+0

Si tiene un archivo .m con el nombre 'myfunc' (y la primera línea que no hace comentarios en ese archivo se lee como "función y = myfunc (x)") simplemente escriba y1 = myfunc (x1). – nimrodm

+0

muchas gracias! ¿Pero cómo importaría o cargaría tal archivo? Como era de esperar, obtengo '??? Función no definida o variable 'getBz'' sin hacer nada de antemano. – wrongusername

13

Si entiendo su situación correctamente, tienen algo como esto:

Un archivo (`a.m '):

function results = A(parameters) 
    % some code 

Un archivo (` B.m'):

function results = B(parameters) 
    % some code 

usted desea utilizar la función A dentro B, sólo puede llamar a esa función desde el interior de la función B:

function results = B(parameters) 
    % some code 
    otherResults = A(otherParameters) 

Si su situación es algo parecido a lo que se describe nimrodm, su archivo A.m es algo así como:

function results = A(paramters) 
    % some code 
    function results = C(parameters) 
     % code of function C 
    end 
end 
    function results = D(parameters) 
     % code of function D 
    end 

No hay manera de acceder directamente a C y D desde fuera A. Si es necesario utilizar subfunctionD fuera del A, simplemente hacer un archivo que contiene D.m

function results = D(parameters) 
    % code of function D 
end 

y preferiblemente, eliminado el mismo código de función A.

Para un nested functionC, lo mismo se puede hacer en algunos casos (pero no en todos), ya que las funciones anidadas también tienen acceso a las variables de la función A. En las versiones recientes de MATLAB (creo que R2010b o R2011a), el editor resalta las variables que se comparten entre una función y las funciones anidadas en el trullo.Si no utiliza las variables de la función A dentro de la función C, haga lo mismo que para la función D. Si lo hace, pase estas variables como parámetros y/o valores de retorno y ajuste el resto de su código para reflejar esto. Pruebe su código y luego, haga lo mismo que para D.

Lo más probable es que no tenga el estuche C, ya que esta es una característica avanzada en MATLAB.

Sin embargo, hay otro caso, si no está utilizando funciones de MATLAB, sino scripts de MATLAB en diferentes archivos. Puede llamar a un script (ambos de línea de comandos y otra función o script, simplemente por su nombre (archivo)

contenido del archivo E.m:.

% code for script E 

contenido del archivo F.m:

% some code 
E; 

Usando ese código, ejecuta todos los comandos en E desde la secuencia de comandos interna F. Tenga en cuenta que E y F compartirán todas sus variables, por lo que si comienza su scri pts por algo como clear all; close all; clc;, no puede pasar ninguna variable de F a E (y perderá todos los resultados de F calculados antes de llamar al E.

En la mayoría de los casos, es mejor usar funciones en lugar de secuencias de comandos, así que esa es también la manera de resolver una situación como esa: hacer que todo funcione con parámetros decentes y valores de retorno.

editar: Después de 'cambiar' su pregunta, es bastante fácil.

Consideremos que tiene la función, voy a utilizar diferentes nombres, ya que es más intuitivo de entender. Tiene la función ackermann dentro del archivo ackermann.m al que desea llamar desde el script bigScript.m.

El archivo ackermann.m contiene la función Ackermann-Péter (como ejemplo):

function result = ackermann(m,n) 
    if m == 0 
     result = n + 1; 
    elseif m > 0 
     if n == 0 
      result = ackermann(m-1,1); 
     elseif n > 0 
      result = ackermann(m-1,ackermann(m,n-1)); 
     else 
      error('n has to be positive'); 
     end 
    else 
     error('m has to be positive'); 
    end 
end 

Desde el interior de su gran guión, puede llamar a la función ackermann de la siguiente manera (si desea que m = 1 yn = 1) :

A = ackermann(1,1) 

Es así de simple, no hay necesidad de cargar nada. Pero debe recordar tener la función 'disponible en su camino', la manera más fácil de hacerlo es simplemente mantener los archivos de script y función en el mismo directorio.

De todos modos, tengo la sensación de que usted es un usuario de MATLAB inicial: si no sabe lo que hace una función, simplemente escriba help functionname (sustituyendo functionname of course) en la ventana de comandos. Notará que la función load está ahí para cargar archivos de datos, no para m-files (ya que los m-files en su ruta se usan automáticamente).

+2

Hm, gracias Egon, pero supongo que necesitaría de alguna manera importar otro archivo '.m' para usarlo, al igual que en C++ y python y otros lenguajes. ¿Cómo puedo hacer esto, ya que 'load a.m' me da un error sobre el número de columnas que son diferentes? Además, actualizaré la pregunta para que quede más clara. – wrongusername

+2

@wrongusername Resulta que no necesita hacer nada para "cargar" function1.m en Matlab. Si function1.m y function2.m están en la misma carpeta, puede llamar a function1() desde dentro de function2.m() – solvingPuzzles

11

Para cualquier otra persona en busca de esta cuestión, como lo hice, solo escribe:

addpath('[Path name of mat file]'); 

Esto le dirá Matlab cómo encontrar la función. Para verificarlo, solo escriba:

which [function name] 

Si tiene éxito, debe indicar la ruta que acaba de agregar.

Cuestiones relacionadas