Est-il possible d'avoir des arguments par défaut dans Matlab? Par exemple, ici:
function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))
J'aimerais que la vraie solution soit un argument optionnel de la fonction wave. Si c'est possible, quelqu'un peut-il démontrer la bonne façon de procéder? Actuellement, j'essaye ce que j'ai posté ci-dessus et j'obtiens:
??? 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
états), facile à entretenir, compact et flexible.Une autre manière légèrement moins hacky est
la source
Oui, ce serait peut-être vraiment bien d'avoir la capacité de faire ce que vous avez écrit. Mais ce n'est pas possible dans MATLAB. Beaucoup de mes utilitaires qui autorisent les valeurs par défaut pour les arguments ont tendance à être écrits avec des vérifications explicites au début comme ceci:
Ok, donc j'appliquerais généralement un meilleur message d'erreur plus descriptif. Voir que la vérification d'une variable vide permet à l'utilisateur de passer une paire de crochets vides, [], comme espace réservé pour une variable qui prendra sa valeur par défaut. L'auteur doit toujours fournir le code pour remplacer cet argument vide par sa valeur par défaut.
Mes utilitaires qui sont plus sophistiqués, avec BEAUCOUP de paramètres, qui ont tous des arguments par défaut, utiliseront souvent une interface de paire propriété / valeur pour les arguments par défaut. Ce paradigme de base est vu dans les outils graphiques de poignée de matlab, ainsi que dans optimset, odeset, etc.
Pour travailler avec ces paires propriété / valeur, vous devrez vous renseigner sur varargin, comme moyen de saisir un nombre entièrement variable d'arguments dans une fonction. J'ai écrit (et posté) un utilitaire pour travailler avec de telles paires propriété / valeur, parse_pv_pairs.m . Il vous aide à convertir des paires propriété / valeur en une structure matlab. Il vous permet également de fournir des valeurs par défaut pour chaque paramètre. Convertir une liste de paramètres peu maniable en une structure est une TRÈS belle façon de les transmettre dans MATLAB.
la source
C'est ma façon simple de définir les valeurs par défaut d'une fonction, en utilisant "try":
Cordialement!
la source
J'ai trouvé que la fonction parseArgs peut être très utile.
la source
Il existe également un «hack» qui peut être utilisé bien qu'il puisse être supprimé de matlab à un moment donné: La fonction eval accepte en fait deux arguments dont le second est exécuté si une erreur s'est produite avec le premier.
Ainsi, nous pouvons utiliser
pour utiliser la valeur 1 par défaut pour l'argument
la source
Je crois que j'ai trouvé un moyen assez astucieux de résoudre ce problème, en ne prenant que trois lignes de code (sauf les retours à la ligne). Ce qui suit est tiré directement d'une fonction que j'écris, et cela semble fonctionner comme vous le souhaitez:
Je pensais juste que je le partagerais.
la source
Je suis confus que personne n'a signalé ce billet de blog par Loren, l'un des développeurs de Matlab. L'approche est basée sur
varargin
et évite tous ces interminables et douloureuxif-then-else
ouswitch
cas avec des conditions alambiquées. Lorsqu'il existe quelques valeurs par défaut, l'effet est dramatique . Voici un exemple du blog lié:Si vous ne comprenez toujours pas, essayez de lire l'intégralité du billet de blog de Loren. J'ai écrit un article de blog de suivi qui traite des valeurs par défaut de position manquantes . Je veux dire que vous pourriez écrire quelque chose comme:
et ont toujours la
eps
valeur par défaut pour letol
paramètre (et le@magic
rappel pourfunc
bien sûr). Le code de Loren permet cela avec une modification légère mais délicate.Enfin, quelques avantages de cette approche:
if-then-else
approches, qui s'allonge à chaque nouvelle valeur par défaut)À vrai dire, il y a aussi un inconvénient. Lorsque vous tapez la fonction dans le shell Matlab et oubliez ses paramètres, vous verrez
varargin
un indicateur inutile . Pour gérer cela, il est conseillé d'écrire une clause d'utilisation significative.la source
Après avoir pris connaissance de ASSIGNIN (grâce à cette réponse de b3 ) et EVALIN j'ai écrit deux fonctions pour enfin obtenir une structure d'appel très simple:
Voici la liste:
et
la source
Ceci est plus ou moins tiré du manuel Matlab ; Je n'ai qu'une expérience passagère ...
la source
Matlab ne fournit pas de mécanisme pour cela, mais vous pouvez en construire un dans le code utilisateur qui soit plus laconique que les séquences inputParser ou "if nargin <1 ...".
Ensuite, vous pouvez l'appeler dans vos fonctions comme ceci:
La mise en forme est une convention qui vous permet de lire les noms de paramètres jusqu'à leurs valeurs par défaut. Vous pouvez étendre votre getargs () avec des spécifications de type de paramètre facultatives (pour la détection d'erreur ou la conversion implicite) et des plages de nombre d'arguments.
Cette approche présente deux inconvénients. Tout d'abord, il est lent, vous ne voulez donc pas l'utiliser pour des fonctions appelées en boucle. Deuxièmement, l'aide aux fonctions de Matlab - les conseils de saisie semi-automatique sur la ligne de commande - ne fonctionne pas pour les fonctions varargin. Mais c'est assez pratique.
la source
vous voudrez peut-être utiliser la
parseparams
commande dans matlab; l'utilisation ressemblerait à:la source
Par exemple
f(2,4,'c',3)
, le paramètrec
est 3.la source
si vous utilisiez octave, vous pourriez le faire comme ceci - mais malheureusement, matlab ne prend pas en charge cette possibilité
(extrait du doc )
la source
J'aime faire cela d'une manière un peu plus orientée objet. Avant d'appeler wave (), sauvegardez certains de vos arguments dans une structure, par exemple. un appelé paramètres:
Dans la fonction wave, vérifiez si les paramètres de la structure contiennent un champ appelé 'flag' et si c'est le cas, si sa valeur n'est pas vide. Attribuez-lui ensuite une valeur par défaut que vous avez définie auparavant, ou la valeur donnée en argument dans la structure des paramètres:
Cela facilite la gestion d'un grand nombre d'arguments, car cela ne dépend pas de l'ordre des arguments donnés. Cela dit, il est également utile si vous devez ajouter plus d'arguments ultérieurement, car vous n'avez pas à modifier la signature des fonctions pour le faire.
la source
wave(a,b,'flag',42,'fTrue',1)