web-dev-qa-db-fra.com

Erreur MATLAB: fonction ou méthode X non définie pour les arguments d'entrée de type 'double'

Je suis un nouvel utilisateur de Matlab, pouvez-vous s'il vous plaît aider:
J'ai le code suivant dans un fichier .M:

function f = divrat(w, C)
S=sqrt(diag(diag(C)));
s=diag(S);
f=sqrt(w'*C*w)/(w'*s);

J'ai stocké ce fichier (divrat.M) dans le chemin normal de Matlab et je suppose donc que Matlab lira la fonction au démarrage et que cette fonction devrait donc être disponible.

Cependant, quand je tape

>> divrat(w, C)

Je reçois l'erreur suivante

??? Fonction ou méthode non définie 'divrat' pour les arguments d'entrée de type 'double'. 

Quel est le message d'erreur me disant de faire, je ne vois aucune erreur dans le code ou l'appel de fonction?

18
Per

Vous obtenez cette erreur lorsque la fonction n'est pas sur le chemin MATLAB ou dans pwd.

Tout d’abord, assurez-vous de pouvoir trouver la fonction en utilisant:

>> which divrat
c:\work\divrat\divrat.m

Si cela revient:

>> which divrat
'divrat' not found.

Ce n'est pas sur le chemin MATLAB ou dans PWD.

Deuxièmement, assurez-vous que le répertoire qui contient divrat se trouve sur le chemin MATLAB à l’aide de la commande PATH. Il se peut qu'un répertoire que vous pensiez être sur le chemin ne soit pas réellement sur le chemin.

Enfin, assurez-vous de ne pas utiliser un répertoire "privé". Si divrat se trouve dans un répertoire nommé private, il sera accessible par les fonctions du répertoire parent, mais pas à partir de la ligne de commande MATLAB:

>> foo

ans =

     1

>> divrat(1,1)
??? Undefined function or method 'divrat' for input arguments of type 'double'.

>> which -all divrat
c:\work\divrat\private\divrat.m  % Private to divrat
28
Todd

Comme d'autres l'ont fait remarquer, il s'agit très probablement d'un problème lié au chemin du fichier de fonction qui n'est pas dans le "chemin" de Matlab.

Un moyen simple de vérifier cela consiste à ouvrir votre fonction dans l'éditeur et à appuyer sur le bouton F5 clé. Ceci obligerait l’éditeur à essayer d’exécuter le fichier. Si le fichier n’est pas dans le chemin, il vous demandera une boîte de message. Choisissez Add to Path dans cela, et vous devez aller bien.

Remarque secondaire: à la fin du processus ci-dessus, la fenêtre de commande Matlab affichera une erreur en disant que les arguments manquent: nous n’avons évidemment fourni aucun argument lorsque nous avons essayé de s’exécuter depuis l’éditeur. Mais à partir de maintenant, vous pouvez utiliser la fonction de la ligne de commande en donnant les arguments corrects.

5
sundar

La cause la plus courante de ce problème est que Matlab ne peut pas trouver le fichier sur son chemin de recherche. En gros, Matlab cherche des fichiers dans:

  1. Le répertoire en cours (pwd);
  2. Directement dans un répertoire du chemin (pour voir le chemin, tapez path sur la ligne de commande) 
  3. Dans un répertoire nommé @(whatever the class of the first argument is) qui se trouve dans l'un des répertoires ci-dessus.

    Comme quelqu'un l’a suggéré, vous pouvez utiliser la commande which, mais c’est souvent inutile dans ce cas-ci. Cela vous indique que Matlab ne trouve pas le fichier que vous connaissiez déjà.

    La première chose à faire est donc de s’assurer que le fichier est localisable sur le chemin.

    La prochaine chose à faire est de s’assurer que le fichier que matlab trouve (utilise lequel) requiert le même type que le premier argument que vous passez réellement. I.el, Si w est censé être une classe différente et qu'il existe une fonction divrat ici, mais w est en fait vide, [], donc matlab recherche Double/divrat, alors qu'il n'y a qu'une fonction @(yourclass)/divrat.. mais cela me mord souvent.

4
Marc

La fonction elle-même est un code matlab valide. Le problème doit être autre chose.
Essayez d'appeler la fonction à partir du répertoire où il se trouve ou ajoutez ce répertoire à votre chemin de recherche à l'aide de addpath('pathname').

2
bastibe

Le code d'erreur indique que la définition de la fonction est introuvable. Assurez-vous que vous appelez la fonction à partir du même espace de travail que le fichier divrat.m est stocké. Et assurez-vous que la fonction divrat n'est pas une sous-fonction, il devrait s'agir de la première déclaration de fonction dans le fichier. Vous pouvez également essayer d'appeler la fonction à partir du même fichier divrat.m afin de voir si le problème provient de la sélection de l'espace de travail ou de la fonction.

Au fait, pourquoi n'avez-vous pas simplement dit 

s = sqrt(diag(C));

Ne serait-ce pas pareil?

2
hakan

Nommez-le aussi divrat.m, pas divrat.M. Cela ne devrait pas avoir d'importance sur la plupart des systèmes d'exploitation, mais qui sait ...

Vous pouvez également vérifier si matlab peut trouver une fonction à l’aide de la commande which, c.-à-d. 

which divrat
2
Mr Fooz

Je suis à peu près sûr que la raison de ce problème est due à la licence de la boîte à outils (package) à laquelle appartient cette fonction. Écrivez which divrat et voyez quel sera le résultat. S'il renvoie le chemin de la fonction et le commentaire Has no license available, le problème est lié à la licence. Cela signifie que la licence du package n'est pas définie correctement. Cela se produit généralement si le package (boîte à outils) de cette fonction est ajouté ultérieurement, c’est-à-dire après l’installation de la matlab originale. S'il vous plaît vérifier et résoudre le problème de licence, alors cela fonctionnera bien. 

0
eyasu