83 votos

Argumentos por defecto en Matlab

¿Es posible tener argumentos por defecto en Matlab? Por ejemplo, aquí:

function wave(a,b,n,k,T,f,flag,fTrue=inline('0'))

Me gustaría que la verdadera solución fuera un argumento opcional para la función de onda. Si es posible, ¿alguien puede demostrar la forma correcta de hacerlo? Actualmente, estoy probando lo que he publicado arriba y lo consigo:

??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.

¡Gracias!

116voto

simon Puntos 5346

Por lo que sé, no hay una forma directa de hacer esto como lo has intentado.

El enfoque habitual es utilizar varargs y comprobar el número de args. Algo así como:

function f(arg1,arg2,arg3)

  if nargin < 3
    arg3 =   'some default'
  end

end

Hay algunas cosas más extravagantes que se pueden hacer con el vacío, etc., y tal vez quieras buscar en la central de matlab por algunos paquetes que agrupan este tipo de cosas.

[actualización] Me alegro de que eso haya ayudado.

podrías echar un vistazo a varargin, nargchk, etc. Son funciones útiles para este tipo de cosas. Las varargs te permiten dejar un número variable de argumentos finales, pero esto no te evita el problema de los valores por defecto para algunos/todos ellos.

48voto

Matt Puntos 381

He usado el inputParser objeto para tratar con la configuración de las opciones por defecto. Matlab no aceptará el formato tipo Python que especificaste en la pregunta, pero deberías poder llamar a la función así:

wave(a,b,n,k,T,f,flag,'fTrue',inline('0'))

Después de definir el wave funcionan así:

function wave(a,b,n,k,T,f,flag,varargin)

i_p = inputParser;
i_p.FunctionName = 'WAVE';

i_p.addRequired('a',@isnumeric);
i_p.addRequired('b',@isnumeric);
i_p.addRequired('n',@isnumeric);
i_p.addRequired('k',@isnumeric);
i_p.addRequired('T',@isnumeric);
i_p.addRequired('f',@isnumeric);
i_p.addRequired('flag',@isnumeric); 
i_p.addOptional('ftrue',inline('0'),1);    

i_p.parse(a,b,n,k,T,f,flag,varargin{:});

Ahora los valores pasados a la función están disponibles a través de i_p.Results . Además, no estaba seguro de cómo validar que el parámetro pasado para ftrue era en realidad un inline así que dejé el validador en blanco.

14voto

Peter Puntos 71

Otra forma un poco menos invasiva es

function output = fun(input)
   if ~exist('input','var'), input='BlahBlahBlah'; end
   ...
end

3voto

Mr Fooz Puntos 21092

He descubierto que el parseArgs puede ser muy útil.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X