¿Es posible tener argumentos predeterminados 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 sea un argumento opcional para la función de onda. Si es posible, ¿alguien puede demostrar la forma correcta de hacer esto? Actualmente, estoy intentando lo que publiqué anteriormente y obtengo:
??? 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.
if nargin
estadios), fácil de mantener, compacto y flexible.Otra forma un poco menos hacky es
fuente
Sí, podría ser realmente bueno tener la capacidad de hacer lo que ha escrito. Pero no es posible en MATLAB. Muchas de mis utilidades que permiten valores predeterminados para los argumentos tienden a escribirse con comprobaciones explícitas al principio de esta manera:
Ok, entonces generalmente aplicaría un mensaje de error mejor y más descriptivo. Observe que la comprobación de una variable vacía permite al usuario pasar un par de paréntesis vacíos, [], como marcador de posición para una variable que tomará su valor predeterminado. Sin embargo, el autor aún debe proporcionar el código para reemplazar ese argumento vacío con su valor predeterminado.
Mis utilidades que son más sofisticadas, con MUCHOS parámetros, todos los cuales tienen argumentos predeterminados, a menudo usan una interfaz de par propiedad / valor para los argumentos predeterminados. Este paradigma básico se ve en las herramientas de manejo de gráficos en matlab, así como en optimset, odeset, etc.
Como un medio para trabajar con estos pares de propiedad / valor, necesitará aprender sobre varargin, como una forma de ingresar un número completamente variable de argumentos a una función. Escribí (y publiqué) una utilidad para trabajar con tales pares de propiedad / valor, parse_pv_pairs.m . Le ayuda a convertir pares de propiedad / valor en una estructura matlab. También le permite proporcionar valores predeterminados para cada parámetro. Convertir una lista de parámetros difícil de manejar en una estructura es una manera MUY buena de pasarlos en MATLAB.
fuente
Esta es mi manera simple de establecer valores predeterminados para una función, usando "try":
¡Saludos!
fuente
Descubrí que la función parseArgs puede ser muy útil.
fuente
También hay un 'hack' que puede usarse, aunque podría eliminarse de matlab en algún momento: la función eval realmente acepta dos argumentos, de los cuales el segundo se ejecuta si ocurre un error con el primero.
Así podemos usar
usar el valor 1 como predeterminado para el argumento
fuente
Creo que encontré una manera bastante ingeniosa de lidiar con este problema, tomando solo tres líneas de código (excluyendo los ajustes de línea). Lo siguiente se extrae directamente de una función que estoy escribiendo, y parece funcionar como se desea:
Solo pensé en compartirlo.
fuente
Estoy confundido de que nadie haya señalado esta publicación de blog de Loren, uno de los desarrolladores de Matlab. El enfoque se basa
varargin
y evita todos esos casos interminables y dolorososif-then-else
oswitch
con condiciones complicadas. Cuando hay algunos valores predeterminados, el efecto es dramático . Aquí hay un ejemplo del blog vinculado:Si aún no lo entiende, intente leer toda la publicación de blog de Loren. He escrito una publicación de blog de seguimiento que trata con valores predeterminados posicionales faltantes . Quiero decir que podrías escribir algo como:
y todavía tiene el
eps
valor predeterminado para eltol
parámetro (y la@magic
devolución de llamada, porfunc
supuesto). El código de Loren permite esto con una modificación leve pero complicada.Finalmente, solo algunas ventajas de este enfoque:
if-then-else
enfoques, que se alarga con cada nuevo valor predeterminado)A pesar de todo, también hay una desventaja. Cuando escribe la función en el shell de Matlab y olvida sus parámetros, verá un poco útil
varargin
como una pista. Para lidiar con eso, se recomienda escribir una cláusula de uso significativa.fuente
Después de conocer ASSIGNIN (gracias a esta respuesta de b3 ) y EVALIN , escribí dos funciones para finalmente obtener una estructura de llamada muy simple:
Aquí está el listado:
y
fuente
Esto es más o menos sacado del manual de Matlab ; Solo tengo experiencia pasajera ...
fuente
Matlab no proporciona un mecanismo para esto, pero puede construir uno en el código de usuario que sea más terso que las secuencias inputParser o "if nargin <1 ...".
Entonces puedes llamarlo en tus funciones así:
El formato es una convención que le permite leer los nombres de los parámetros a sus valores predeterminados. Puede ampliar sus getargs () con especificaciones de tipo de parámetro opcionales (para detección de errores o conversión implícita) y rangos de recuento de argumentos.
Hay dos inconvenientes para este enfoque. Primero, es lento, por lo que no desea usarlo para funciones que se llaman en bucles. En segundo lugar, la ayuda de funciones de Matlab, las sugerencias de autocompletado en la línea de comandos, no funcionan para las funciones de varargin. Pero es bastante conveniente.
fuente
es posible que desee utilizar el
parseparams
comando en matlab; el uso se vería así:fuente
Por ejemplo,
f(2,4,'c',3)
hace que el parámetroc
sea 3.fuente
si usara octava, podría hacerlo así, pero lamentablemente matlab no admite esta posibilidad
(tomado del documento )
fuente
Me gusta hacer esto de una manera algo más orientada a objetos. Antes de llamar a wave (), guarde algunos de sus argumentos dentro de una estructura, por ejemplo. uno llamado parámetros:
Dentro de la función de onda, verifique si los parámetros de estructura contienen un campo llamado 'flag' y, si es así, si su valor no está vacío. Luego, asigne un valor predeterminado que defina antes, o el valor dado como argumento en la estructura de parámetros:
Esto facilita el manejo de un gran número de argumentos, ya que no depende del orden de los argumentos dados. Dicho esto, también es útil si tiene que agregar más argumentos más adelante, porque no tiene que cambiar la firma de funciones para hacerlo.
fuente
wave(a,b,'flag',42,'fTrue',1)