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?
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
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.
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:
pwd
);path
sur la ligne de commande) @(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.
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')
.
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?
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
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.