web-dev-qa-db-fra.com

"Fonction 'nom_fonction' non définie pour les arguments d'entrée de type 'double'."

Une question qui apparaît assez souvent sous différentes formes et tailles est la suivante: Pourquoi le message d'erreur suivant s'affiche-t-il:

"Fonction 'nom_fonction' non définie pour les arguments d'entrée de type 'double'."

Cet article tente de traiter tous les différents scénarios dans lesquels ce message d'erreur peut survenir et propose des solutions pour le résoudre.

16
Stewie Griffin

Si vous tombez sur ce message d'erreur et ne savez pas ce que cela signifie. Rassurez-vous en ceci: 90% d’entre nous avons googlé la même phrase.

"Fonction 'int' non définie pour les arguments d'entrée de type 'double'."

Le message d'erreur est assez explicite, mais peut toujours causer de la confusion. (J'ai choisi 'int' au hasard, il pourrait tout aussi bien être 'train', 'table', 'my_function' ou autre chose).

Cette erreur se produit dans deux cas principaux: 

  1. Vous essayez d'utiliser une fonction qui n'existe pas (encore)
  2. Vous essayez d'accéder à un élément d'une variable qui n'existe pas (encore)

Que faites-vous si vous obtenez cette erreur?

Vous voudrez peut-être d’abord essayer which . Cela vous dira si la fonction ou la variable que vous essayez d'utiliser est définie ou non. 

which int
'int' not found.

Il est évident que Matlab ne trouve aucune fonction ni variable nommée int. Essayer de l'utiliser est donc inutile. Comparons-le à max:

which max
built-in (C:\Program Files\MATLAB\R2014b\toolbox\matlab\datafun\@logical\max)  % logical method

Mais vous pourriez obtenir ce qui suit, même si vous obtenez la "fonction indéfinie 'x' ...". Si tel est le cas, voir le point 3 ci-dessous.

which x
x is a variable.

1. Mais la fonction "int" existe! C'est même documenté ici !?

Oui, int existe, mais seulement si vous avez la Symbolic Toolbox . Comme les boîtes à outils sont des packages supplémentaires qui doivent être achetés séparément (et peuvent être assez coûteux), il est probable que vous ne disposiez pas de ce package. 

Si vous obtenez l'erreur "Fonction indéfinie", mais que vous trouvez la fonction dans la documentation, consultez le menu à gauche ou vérifiez simplement l'adresse. Les fonctions Matlab standard ont des adresses telles que:

mathworks.com/help/matlab/ref/max.html
                   ^^^^^^

Remarquez la partie "matlab". Si vous voyez cela, alors vous utilisez une fonction qui fait partie du noyau Matlab. 

Toutefois, si vous voyez une adresse telle que celle ci-dessous, la fonction que vous essayez d'utiliser fait partie de la Boîte à outils symbolique:

mathworks.com/help/symbolic/int.html
                   ^^^^^^^^

ou peut-être que cela fait partie de la boîte à outils du réseau neuronal:

mathworks.com/help/nnet/ref/train.html
                   ^^^^ 

Solution: Trouvez une autre fonction qui ne fait pas partie d'une boîte à outils que vous n'avez pas. Les chances sont que vous trouverez ce que vous cherchez si vous êtes un googleur qualifié. Si vous ne le trouvez pas, demandez de l'aide. Expliquez ce que vous avez essayé et montrez que vous avez fait des efforts!

2. Mais la fonction est documentée ici et fait partie du noyau de Matlab !?

Même si une fonction fait partie de l'installation standard de Matlab et qu'elle est bien documentée, il est possible que vous obteniez toujours cette erreur. La cause la plus probable de cette erreur est que vous utilisez une version plus ancienne de Matlab. Si vous consultez la documentation, vous verrez ce qui suit au bas de la page:

Introduit dans R2013b 

Donc, si vous utilisez R2012b, vous ne pouvez pas utiliser par exemple table

Solution: Vérifiez si la fonction est définie dans votre version de Matlab. S'il n'est pas encore implémenté, vous devez soit mettre à jour Matlab, soit trouver un autre moyen de le faire. Une alternative à table peut par exemple être d'utiliser des cellules ou des structures. 

3. Mais la variable "ma_variable" existe! Je l'ai créé dans la ligne ci-dessus!

Non, tu n'as pas. Vous avez probablement créé la variable myvariable, my_Variable, my_Variable ou quelque chose de similaire dans la ligne ci-dessus. Il est également possible que vous l’ayez créée mais que vous ayez accidentellement cleared it. 

Solution: Parcourez le code. Recherchez les fautes de frappe, les endroits où vous avez effacé accidentellement la variable, etc. Dans l'éditeur Matlab, vous verrez la ligne suivante en bas si vous marquez une variable: "3 utilisations de" x "trouvé" si vous avez défini et utilisé la fonction . Vous obtiendrez également une ligne orange sous les variables non utilisées. 

4. Mais je reçois "y est une variable" quand je tape which y?

Si vous obtenez l'erreur ci-dessus "Fonction non définie 'y', mais que which vous indique que y existe, votre message d'erreur contient quelques lignes supplémentaires:

my_function(x)
Undefined function or variable 'y'.
Error in my_function (line 2)
t = x*y; 

>> which y
y is a variable.

Cela vous indique que vous avez une variable appelée y dans votre Matlab Workspace (vérifiez également ce lien ).

Le problème est que les fonctions ne peuvent pas accéder à cet espace de travail:

Les fonctions n'utilisent pas l'espace de travail de base. Chaque fonction a son propre espace de travail.

Si vous voulez qu'une fonction voie et utilise une variable, vous devez la passer sous la forme d'un argument -. De cette façon, la variable fera partie de l’espace de travail local pour cette fonction. De même, si vous voulez que les variables créées dans la fonction soient accessibles en dehors de la fonction, vous devez les avoir comme sortie de la fonction.

Solution: Transmettez les variables que vous souhaitez utiliser comme arguments d'entrée pour la fonction que vous utilisez. Assurez-vous que les noms à l'intérieur des fonctions sont cohérents en interne. C'est à dire. il doit avoir le même nom dans toute la fonction. Notez qu'il n'y a pas de lien entre les noms de variables à l'extérieur et à l'intérieur de la fonction.

5. Mais je passe la variable comme entrée à la fonction, mais j'obtiens toujours le même message d'erreur !?

Oui, vous utilisez probablement la variable comme entrée. Cependant, les noms de variables ne sont pas nécessairement les mêmes dans des fonctions différentes (le plus souvent, ils ne le sont pas).Supposons que vous ayez la fonction:.

function output = my_function(x) output = 2*y; end

y = 3; res = my_function(y)

Solution: Modifiez le nom du nom de la variable d'entrée dans l'en-tête de la fonction ou modifiez le nom de la variable dans l'ensemble de la fonction.

6. Mais j'ai créé x en tant que variable globale!?.

Tout d'abord: je vous recommande de ne pas utiliser de variables globales! Il est bien préférable de passer des variables comme arguments.

Il ne suffit pas de déclarer une variable comme/- global dans l'espace de travail Matlab. Il doit être déclaré dans chaque fonction dans laquelle vous l'utilisez. Ainsi, si vous avez une variable globale x, vous devez faire global x dans chaque fonction. 

Solution: Réécrivez votre code et transmettez des variables sous forme d'arguments plutôt que d'utiliser des variables globales. Si ce n'est pas une option, ajoutez global x dans toutes les fonctions où vous l'utilisez.

.


En plus de cette réponse, vous pouvez vous référer au document officiel Matlab FAQ .

In addition to this answer, you can refer to the official Matlab FAQ .

23
Stewie Griffin

J'ai aussi 

Fonction indéfinie '...' pour les arguments d'entrée de type 'double'.

erreur et j'ai essayé les recommandations mentionnées ci-dessus, mais ils ne pouvaient pas résoudre mon problème. Ensuite, j'ai réalisé qu'il y avait un caractère spécial (*) dans mon répertoire de travail actuel. Je résous donc le problème lorsque j'ai changé le nom du répertoire. 

Enfin, n'oubliez pas de modifier le répertoire en cours après l'opération de modification à l'aide de l'argument cd.

1
Can Ayhan