IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ erreurs et avertissements

FAQ erreurs et avertissementsConsultez toutes les FAQ

Nombre d'auteurs : 9, nombre de questions : 75, dernière mise à jour : 14 juin 2021 

 
OuvrirSommaireMessages d'erreur MATLAB

Ce message d'erreur n'existe plus depuis la version R2006a de MATLAB et a été remplacé par : CAT arguments dimensions are not consistent.

Créé le 5 novembre 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Ce message d'erreur n'existe plus depuis la version R2006a de MATLAB et a été remplacé par : CAT arguments dimensions are not consistent.

Créé le 5 novembre 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Une chaîne de caractères (ou string en anglais) est délimitée sous MATLAB par deux guillemets simples « ' ».
Cette erreur interviendra lorsque vous oublierez le deuxième « ' » de fin avant un retour à la ligne.

 
Sélectionnez
>> str = 'MATLAB
??? str = 'MATLAB
          |
Error: A MATLAB string constant is not terminated properly.

Si vous souhaitez écrire une chaîne de caractères sur plusieurs lignes, il vous faudra utiliser les crochets de concaténation et trois points signifiant que l'instruction continue à la ligne suivante ainsi :

 
Sélectionnez
str = ['une ligne ' ...
    'qui continue ' ...
    'encore et encore']
Créé le 26 juin 2013  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque l'on veut supprimer des valeurs d'un tableau de plus de deux dimensions en leur assignant la valeur vide « [] ». Elle signifie que MATLAB requiert qu'un seul élément d'indexage soit une valeur, les autres indices étant renseignés avec l'opérateur colon (symbole « : »). Le but est que le résultat garde la forme d'un tableau.

Exemple :

 
Sélectionnez
M = rand(3,4,5,6,7);
M(1,:,4,:,6) = []; % trois valeurs : 1, 4 et 6
??? A null assignment can have only one non-colon index.
 
Sélectionnez
M = rand(3,4,5,6,7);
M(1,:,:,:,6) = []; % deux valeurs : 1 et 6
??? A null assignment can have only one non-colon index.
 
Sélectionnez
M = rand(3,4,5,6,7);
M(:,:,4,:,:) = []; % une seule valeur : 4 => OK
size(M)

ans =

     3     4     4     6     7
Créé le 13 juin 2011  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

  • Une dimension singleton est égale à 1.
  • « rhs » (right hand side) désigne le terme de droite de l'affectation.

Le terme de droite de l'affectation n'a pas le même nombre de dimensions supérieures à 1 que celui demandé par l'indexage du terme de gauche. Cette erreur est liée à l'utilisation de l'opérateur colon « : ».

 
Sélectionnez
>> M = rand(2,2,2)

M(:,:,1) =

    0.6813    0.8318
    0.3795    0.5028


M(:,:,2) =

    0.7095    0.3046
    0.4289    0.1897

>> A = rand(2,2,1)

A =

    0.1934    0.3028
    0.6822    0.5417

>> A(:,:,:)=M
??? Assignment has more non-singleton rhs dimensions than non-singleton subscripts.
Créé le 27 mai 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur peut se produire dans deux cas :

1) le fichier Script <filename> est exécuté en spécifiant des arguments d'entrée et/ou de sortie : comme indiqué dans la documentation, seuls les fichiers Fonction acceptent le passage d'arguments en entrée et en sortie.

La solution consiste ici à transformer le fichier Script en fichier Fonction.

2) le fichier Script <filename> a le même nom qu'une fonction MATLAB : pour s'en rendre compte, votre script doit apparaître en premier dans la liste retournée par la fonction whichDocumentation fonction which :

 
Sélectionnez
which -all <filename>

Les deux solutions possibles sont :

  1. modifier le nom du fichier Script <filename> afin d'éviter le conflit de nom ;
  2. modifier le chemin de recherche (path) de MATLAB pour que la fonction MATLAB soit vue en premier.
Créé le 27 mai 2007  par Aurélien Queffurust

Lien : Quelle est la différence entre un script et une fonction ?
Lien : Comment exploiter les messages d'erreurs ?
Lien : Why do I receive the error "Attempt to execute SCRIPT as a function" ?

Cette erreur intervient lorsque l'on tente d'accéder au contenu d'un champ d'une variable qui n'est pas une structure.

Exemple

 
Sélectionnez
maStruct = struct('Nom','Dupond','Age',23);
maStruct.Nom % renvoie Dupond

Mais

 
Sélectionnez
S = rand(10);	% S vecteur, n'est pas une structure
S.Nom
??? Attempt to reference field of non-structure array.

Pour vérifier si une variable est de type Structure, on peut utiliser la fonction isstructDocumentation fonction isstruct.

Dans le cas des interfaces graphiques, et qui plus est avec le GUIDE, la cause peut être :

  1. l'utilisation de la variable handles dans un *_CreateFcn. Il faut alors faire attention que cette variable structure reste vide (= []) jusqu'à ce que tous les CreateFcn aient été appelés. On préfèrera utiliser l'entrée hObject qui représente le handle de l'objet associé à la fonction ;
  2. le lancement de l'interface graphique depuis le .fig (avec openfigDocumentation fonction openfig, openDocumentation fonction open, ou double-clic sur l'icône). Le .fig ne contenant que les propriétés graphiques, c'est le .m qu'il faut appeler comme toute autre fonction afin de lancer l'exécution.

     
    Sélectionnez
    [<arguments de sortie>] = NomDeLaFonction(<arguments d'entrée>)
Créé le 13 juin 2011  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient lors de l'utilisation de fonctions telles que loadDocumentation de la fonction load, evalDocumentation de la fonction eval, evalinDocumentation de la fonction evalin, assigninDocumentation de la fonction assignin ou runDocumentation de la fonction run ou lors de l'appel à un script, qui a pour effet d'ajouter au workspace actuel de nouvelles variables non définies auparavant de manière explicite.

Cet ajout « inattendu » de variable n'est pas autorisé en présence de fonctions imbriquées, ou au sein de fonctions anonymes : chaque définition de variable doit clairement apparaître dans le code.

Afin d'éviter cette erreur, on privilégiera l'utilisation du retour de fonction à l'utilisation de scripts.

Exemples :

  • mon_script.m
    Sélectionnez
    my_var = 10;
    exemple.m
    Sélectionnez
    function exemple()
    mon_script % appel à mon_script qui crée la variable my_var
               % dans le workspace de la fonction exemple

    deviendra :

    ma_fonction.m
    Sélectionnez
    function my_var = ma_fonction()
    my_var = 10;
    exemple.m
    Sélectionnez
    function exemple()
    my_var = ma_fonction();
  •  
    Sélectionnez
    % À la place de
    load('mon_fichier.mat', 'X', 'Y');
    X, Y
    % On préfèrera :
    S = load('mon_fichier.mat', 'X', 'Y');
    S.X, S.Y

Il reste possible, lorsque le nom de la variable est connu à l'avance, de la définir en amont de façon explicite en l'assignant à une valeur quelconque (par exemple la valeur vide) :

 
Sélectionnez
function exemple()
my_var = [];
mon_script
 
Sélectionnez
X = []; Y = [];
load('mon_fichier.mat', 'X', 'Y');
X, Y

À noter que l'utilisation des fonctions eval, evalin, assignin est en général à éviter.

Créé le 13 août 2014  par Jérôme Marsaguet

Lien : Quelle est la différence entre un script et une fonction ?
Lien : Qu'est-ce qu'un appel fonctionnel ?
Lien : Variables in Nested and Anonymous Functions
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient lors d'une opération de concaténation.

Pour déterminer, si l'erreur provient lors d'une concaténation horizontale entre vecteurs supposés « lignes », ou lors d'une concaténation verticale entre vecteurs supposés « colonnes », il faut regarder le message d'erreur dans son ensemble.

Concaténation horizontale :

 
Sélectionnez
a = [1 2]; % Vecteur ligne
b = [3;4]; % Vecteur colonne
c = [a,b]; % Concaténation horizontale

??? Error using ==> horzcat
CAT arguments dimensions are not consistent.

Concaténation verticale :

 
Sélectionnez
a = [1 2]; % Vecteur ligne
b = [3;4]; % Vecteur colonne
c = [a;b]; % Concaténation verticale

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Solution :

Pour une concaténation verticale, le nombre de colonnes de toutes les tableaux à concaténer doit être identique.

Pour une concaténation horizontale, le nombre de lignes de toutes les tableaux à concaténer doit être identique.

Cas particulier :

L'erreur ci-dessus apparait également lorsque l'on souhaite concaténer à toutes les lignes d'une matrice, le même élément (ou vecteur).

Par exemple, pour ajouter le caractère virgule (',') à toutes les lignes d'un tableau de chaine de caractères. Si l'on essaie avec une simple concaténation :

 
Sélectionnez
>> str = ['A' ; 'B' ; 'C'];
>> [str ',']
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.

La solution consiste à utiliser la fonction strcatDocumentation fonction strcat :

 
Sélectionnez
>> str = ['A' ; 'B' ; 'C'];
>> strcat(str,',')

ans =

A,
B,
C,
Créé le 5 novembre 2007  par Jérôme Briot

Lien : Concatenating Matrices
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque l'on tente d'utiliser une variable qui n'est pas un tableau de cellules (tableau numérique, structure…) en tant que tel, en utilisant les accolades comme le montre cet exemple :

 
Sélectionnez
>> T = rand(3);	% T tableau numérique
>> T{1} = 1:10;	% les accolades supposent que T est un tableau de cellules
??? Cell contents assignment to a non-cell array object.

Elle est souvent liée à un workspace non nettoyé ou une variable antérieure utilisée autrement.

 
Sélectionnez
>> clear T
>> T{1} = 1:10;

On pourra vérifier qu'une variable est un tableau de cellules avec la fonction iscellDocumentation fonction iscell.

Créé le 21 mars 2012  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque l'on tente d'introduire une ou plusieurs cellules à une variable déjà utilisée en tant que tableau numérique.

 
Sélectionnez
>> A = rand(3);
>> B = {1 2 3 ; 4 5 6};
>> A(1,2) = B(1,1);	% Parenthèses = cellule : {1} => erreur
??? The following error occurred converting from cell to double:
Error using ==> double
Conversion to double from cell is not possible.

>> A(1,2) = B{1,1};	% Accolades = contenu de la cellule : 1 => OK

La fonction cell2matDocumentation fonction cell2mat peut se révéler utile dans ces cas-là.

Créé le 21 mars 2012  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

MATLAB est sensible à la casse : différenciation des minuscules/majuscules dans le nom des fonctions et variables. Ainsi deux variables nommées tableau et Tableau sont deux variables bien distinctes et vous obtiendrez une erreur si vous écrivez l'une à la place de l'autre :

 
Sélectionnez
>> tableau = [1 2 ; 3 4];
>> a = Tableau
??? Undefined function or variable 'Tableau'.

En ce qui concerne les fonctions, avant la version MATLAB 2011b, vous obtiendrez juste un message d'avertissement, la « bonne » fonction étant tout de même appelée (exemple pour un fichier nommé maFonction.m) :

 
Sélectionnez
>> mafonction
Warning: Could not find an exact (case-sensitive) match for 'mafonction'.
<chemin du fichier>\maFonction.m is a case-insensitive match and will be used instead.
You can improve the performance of your code by using exact
name matches and we therefore recommend that you update your
usage accordingly. Alternatively, you can disable this warning using
warning('off','MATLAB:dispatcher:InexactCaseMatch').
This warning will become an error in future releases.

À partir de la version R2011b, vous obtiendrez une erreur :

 
Sélectionnez
>> mafonction
??? Cannot find an exact (case-sensitive) match for 'mafonction'.

The closest match is: maFonction
in <chemin du fichier>\maFonction.m
Créé le 13 août 2014  par Jérôme Marsaguet

Lien : Undefined function or variable '***'.

Sous Linux, lors de l'exécution du programme compilé, l'erreur suivante apparait :

 
Sélectionnez
Error while loading shared libraries: libmwmclmcrrt.so.7

À noter que l'extension du fichier libmwmclmcrrt.so.7.* diffère suivant la version du MATLAB Compiler utilisée.

Cette erreur vient de la variable d'environnement LD_LIBRARY_PATH

Pour la corriger, il faut vérifier la valeur de la variable d'environnement dans MATLAB et dans un terminal Linux :

Dans MATLAB :

 
Sélectionnez
getenv('LD_LIBRARY_PATH')

Sous Linux, dans une fenêtre terminal :

 
Sélectionnez
printenv LD_LIBRARY_PATH

Les valeurs retournées doivent être conformes à celles définies comme dans la partie "MCR Path Settings for Development and Testing" de l'aide du MATLAB Compiler.

Mis à jour le 27 septembre 2012  par Aurélien Queffurust

Lien : Comment exploiter les messages d'erreurs ?

L'utilisation des opérateurs logiques court-circuit (Short-circuit && ||) n'est permise qu'à partir de la version 6.5 (R13) de MATLAB.

Pour utiliser le code dans des versions précédentes, il faut remplacer tous les caractères « || » par « | ».

Créé le 27 mai 2007  par Jérôme Briot

Lien : Quelle est la différence entre les opérateurs logiques & et | et les opérateurs logiques && et || ?
Lien : Comment exploiter les messages d'erreurs ?

L'utilisation des opérateurs logiques court-circuit (Short-circuit && ||) n'est permise qu'à partir de la version 6.5 (R13) de MATLAB.

Pour utiliser le code dans des versions précédentes, il faut remplacer tous les caractères « && » par « & ».

Créé le 27 mai 2007  par Jérôme Briot

Lien : Quelle est la différence entre les opérateurs logiques & et | et les opérateurs logiques && et || ?
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur signifie qu'une ligne de votre code n'est pas complète.

Par exemple, l'expression d'affectation incomplète suivante à la première ligne d'un fichier nommé erreur.m :

 
Sélectionnez
a = ;

donne :

 
Sélectionnez
??? Error: File: erreur.m Line: 1 Column: 5
Expression or statement is incomplete or incorrect.
Créé le 1er juillet 2010  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient à l'exécution suivante :

 
Sélectionnez
mcc -m test.m

Elle est due au fait que le fichier test.m est un fichier Script et non pas un fichier fonction.

Il suffit donc d'ajouter la ligne suivante au tout début du fichier :

 
Sélectionnez
function test

Note : le nom test doit bien entendu être remplacé par le nom de votre fichier.

Créé le 27 juin 2008  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Un fichier fonction (ou fonction) est un fichier script évolué. Il ne communique avec le reste des programmes que par l'intermédiaire des variables d'entrée et de sortie définie dans son entête après le mot-clé functionDocumentation mot clé function :

 
Sélectionnez
function [argout1, argout2, …] = fun(argin1, argin2, argin3, …)

L'emploi de ce mot-clé n'est permis que :

  • en première ligne du fichier fonction ;
  • à l'intérieur d'un fichier fonction (sous-fonction ou fonction imbriquée).

Il n'est ni possible d'utiliser le mot-clé function directement dans le Command Window, ni dans un simple fichier script. Dans ce dernier cas, vous devez transformer le fichier script en fichier fonction en lui ajoutant un entête comme celle ci-dessus (en modifiant les arguments selon votre besoin).

Créé le 5 février 2010  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque l'on tente d'assigner un tableau de taille nulle (Empty matrix) à un emplacement où une ou plusieurs valeurs sont attendues.

 
Sélectionnez
>> gt15 = find(1:10 > 15 , 1) % aucune valeur n'est ici supérieure à 15

gt15 =

    Empty matrix: 1-by-0

>> a(1) = gt15 % On attend une valeur non vide
??? Improper assignment with rectangular empty matrix.

On vérifiera donc auparavant que le résultat n'est pas vide avec la fonction isemptyDocumentation fonction isempty, comme ceci :

 
Sélectionnez
gt15 = find(1:10 > 15 , 1); % aucune valeur n'est ici supérieure à 15

if ~isempty(gt15)
    a(1) = gt15;
else
    % Faire autre chose si nécessaire
end
Créé le 28 octobre 2012  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque vous utilisez la syntaxe d'accès à un champ de structure sur un élément qui n'est pas une structure :

 
Sélectionnez
a = rand(3);
a(1).name
??? Improper index matrix reference.

Vous devez donc vérifier le contenu de l'élément concerné qui n'est sûrement pas celui attendu.

Créé le 13 août 2014  par Jérôme Marsaguet

Lien : Attempt to reference field of non-structure array.
Lien : Comment exploiter les messages d'erreurs ?

Le nombre d'index dans l'indexage du terme de gauche de l'affectation doit correspondre au nombre de colonnes ou de lignes du terme de droite

 
Sélectionnez
>> A = [1 2 ; 3 4]

A =

     1     2
     3     4

>> A(:,[1 2])=[1 2 3]
???  In an assignment  A(:,matrix) = B, the number of elements in the subscript of A and the number of columns in B must be the same.
Créé le 27 mai 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

 
Sélectionnez
>> A = [1 2 ; 3 4]

A =

     1     2
     3     4

>> A([1 2],:) = [1 2 3;1 2 3]
???  In an assignment  A(matrix,:) = B, the number of columns in A and B must be the same.
Créé le 27 mai 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Le nombre de lignes du terme de gauche est différent de celui de droite.

 
Sélectionnez
>> A = [1 2 ; 3 4]

A =

     1     2
     3     4

>> A([1 2],:) = [1 2 3]
???  In an assignment A(matrix,:) = B, the number of elements of the subscript in A and number of rows in B must be the same.

>> size(A([1 2],:), 1)

ans =

     2

>> size([1 2 3], 1)

ans =

     1

À consulter aussi pour plus de détails  Subscripted assignment dimension mismatch.

Créé le 27 mai 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Le nombre d'indices dans l'indexage du terme de gauche de l'affectation est différent du nombre d'éléments du terme de droite

 
Sélectionnez
>> a(1:3) = [1 2 3 4] % Ici 3 éléments à gauche et 4 à droite
???  In an assignment  A(I) = B, the number of elements in B and I must be the same.

À consulter aussi pour plus de détails  Subscripted assignment dimension mismatch.

Créé le 27 mai 2007  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Un des indices demandés est supérieur au nombre total d'éléments dans le tableau.

 
Sélectionnez
>> a = [1 2 3 4]

a =

     1     2     3     4

>> a(5)
???  Index exceeds matrix dimensions.
 
Sélectionnez
>> K = [1 2 3 4];
>> for n = 1:10
    2*K(n)
end

ans =

     2


ans =

     4


ans =

     6


ans =

     8

???  Index exceeds matrix dimensions.

Cette erreur peut aussi intervenir lorsque l'on utilise auparavant une variable portant le même nom qu'une fonction MATLAB, et que l'on souhaite par la suite utiliser la fonction (cette pratique est évidemment à éviter. Cf. Conventions de noms : variables).

 
Sélectionnez
>> max = 3; % max, fonction MATLAB est masquée par cette variable max du même nom
>> V = randi(10, 1, 10); % Vecteur donc on souhaite déterminer la valeur maximale

V =

     2    4    6     5     9     2     5    3     8    1

>> valeurMax = max(V) % C'est notre variable max qui est utilisée, elle ne compte qu'un élément, que les indices de V dépassent
??? Index exceeds matrix dimensions.

>> clear max % Nous supprimons notre variable, il ne reste que la fonction MATLAB
>> valeurMax = max(V)

valeurMax =

    9
Mis à jour le 26 juin 2013  par Jérôme Briot, Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsqu'au moins l'un des indices correspondant aux éléments du tableau que l'on veut supprimer dépasse sa taille.

 
Sélectionnez
>> indices = [2 10]; % On veut supprimer les colonnes 2 et 10
>> T  = [1:10 ; 11:20]

T =

     1     2     3     4     5     6     7     8     9    10
    11    12    13    14    15    16    17    18    19    20

>> T(:,indices) = [] % OK : T possède 10 colonnes

T =

     1     3     4     5     6     7     8     9
    11    13    14    15    16    17    18    19

>> T(indices) = [] % ERREUR : T ne possède plus que 8 colonnes (inférieur à indices(2) = 10)
???  Index of element to remove exceeds matrix dimensions.

On prêtera donc une attention particulière :

  • à la taille du tableau (fonction sizeDocumentation fonction size) dont on veut supprimer les éléments ;
  • aux valeurs des indices par rapport à cette taille.

Cette erreur pourra, en particulier, intervenir lors d'une suppression d'éléments en boucle du type :

 
Sélectionnez
for k = 1:taille_tab
    if condition
        tab(k) = [];
    end
end

Une astuce consiste alors à parcourir le tableau à l'envers, en partant du dernier élément pour remontrer vers le premier :

 
Sélectionnez
for k = taille_tab:-1:1
    if condition
        tab(k) = [];
    end
end
Mis à jour le 13 août 2014  par Jérôme Marsaguet

Lien : Index exceeds matrix dimensions.
Lien : Comment ajouter/supprimer des lignes/colonnes à un tableau ?
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsqu'on tente d'utiliser une variable comme une fonction, en lui demandant plusieurs arguments de sortie. Le plus souvent la fonction que l'on aura voulu appeler aura été masquée par une variable portant le même nom (cette pratique est évidemment à éviter, voir Conventions de noms : variables).

Exemple :

 
Sélectionnez
max = 10; % On masque ici la fonction max de MATLAB
monVecteur = rand(10,1);
[maxi, pos] = max(monVecteur); % On veut utiliser ici la fonction max de MATLAB,
                               % mais c'est notre variable qui est utilisée
??? Indexing cannot yield multiple results.
Mis à jour le 26 juin 2013  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient dans le cas d'une opération matricielle non conforme, classiquement une multiplication.

MATLAB suit les règles du calcul matriciel.

Dans le cas d'un produit matriciel, le nombre de colonnes de la matrice de gauche doit être égal au nombre de lignes de la matrice de droite.

 
Sélectionnez
>> A = rand(4,2);
>> B = rand(2,5);
>> A*B

ans =

    0.4661    0.0853    0.3021    0.2943    0.3199
    0.8383    0.1567    0.5761    0.5608    0.6127
    0.5972    0.1354    0.6454    0.6262    0.7041
    1.2082    0.2372    0.9425    0.9165    1.0108

>> C = rand(3,5);
>> A*C
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Note : cette erreur peut aussi survenir lorsqu'on tente d'utiliser l'opérateur de multiplication matriciel (fonction mtimesDocumentation fonction mtimes, opérateur *) au lieu de l'opérateur de multiplication membre à membre (fonction timesDocumentation fonction times, opérateur .*).

 
Sélectionnez
>> A = [1 2 3
        4 5 6];
>> A*A  % Multiplication matricielle (2x3)*(2x3) impossible
??? Error using ==> mtimes
Inner matrix dimensions must agree.

>> A.*A % Multiplication membre à membre : OK

ans =

     1     4     9
    16    25    36
Mis à jour le 21 mars 2012  par Jérôme Briot, Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur est similaire à Not enough input arguments..

Elle apparaît dans le cas d'une fonction ne gérant pas le nombre d'arguments d'entrée (avec les fonctions nargchkDocumentation fonction nargchk et narginDocumentation fonction nargin) quand le nombre d'arguments d'entrée n'est pas suffisant à l'appel de la fonction.

Prenons le cas d'une fonction qui demande deux variables en entrée et qui ne possède pas de ligne de contrôle des entrées :

 
Sélectionnez
function c = mafonction(a,b)

if b > 0
    c = a+b;
else
    c = a-b;
end

Si on appelle la fonction avec un seul argument d'entrée :

 
Sélectionnez
>> x = mafonction(1)
??? Input argument 'b' is undefined.

Lorsque vous appuyez sur le bouton « Run » Image non disponible (ou son racourci F5), aucun argument n'est passé à la fonction à moins que vous ne l'ayez configuréProfiling using run configurations.

Lorsque vous instanciez une classe, pensez à fournir les arguments du constructeur ou dans le cas contraire, à faire un constructeur par défaut qui ne prend aucun argument.

Mis à jour le 13 août 2014  par Caro-Line

Lien : No Input Argument Constructor Requirement
Lien : Comment exploiter les messages d'erreurs ?

Ce message d'erreur apparaît quand on essaie de faire des opérations entre une variable contenant des nombres entiers de classe uintX ou intX (où X vaut 8, 16, 32 bits) et une autre variable contenant, soit des valeurs entières d'une classe différente, soit des valeurs réelles de classe Single ou Double.

Cette erreur est particulièrement fréquente lorque l'on manipule des images où la valeur des pixels est souvent codée grâce à des valeurs entières.

Exemples :

 
Sélectionnez
>> A = uint8([1 2])

A =

    1    2

>> B = uint16([3 4])

B =

      3      4

>> A+B
??? Error using ==> plus
Integers can only be combined with integers of the same class, or scalar doubles.

ou encore :

 
Sélectionnez
>> A = uint8([1 2])

A =

    1    2

>> C = [5 6] % classe Double par défaut

C =

     5     6

>> A+C
??? Error using ==> plus
Integers can only be combined with integers of the same class, or scalar doubles.

Pour résoudre ce problème, il faut convertir une des deux variables dans la classe de l'autre.

En reprenant les exemples ci-dessus :

 
Sélectionnez
>> A = uint8([1 2])

A =

    1    2

>> B = uint16([3 4])

B =

      3      4

>> uint16(A)+B

ans =

      4      6
 
Sélectionnez
>> A = uint8([1 2])

A =

    1    2

>> C = [5 6] % classe Double par défaut

C =

     5     6

>> double(A)+C

ans =

     6     8

On remarque que la dernière partie du message d'erreur stipule qu'une variable contenant des valeurs entières stockées en classe uintX (ou intX) peut être associée avec une valeur scalaire de classe Double.

 
Sélectionnez
>> A = uint8([1 2])

A =

    1    2

>> B = 5 % classe Double par défaut

B =

     5

>> C = A+B

C =

    6    7

La variable résultante sera de la même classe que celle de la variable contenant les valeurs entières.

Ici :

 
Sélectionnez
>> class(C)

ans =

uint8
Créé le 6 février 2011  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque l'ouverture d'un fichier avec la fonction fopenDocumentation de la fonction fopen a échoué, et que malgré cela vous tentez d'utiliser l'identifiant retourné, alors à la valeur -1.

Pour cela, il est conseillé de toujours vérifier si l'ouverture a réussi par la condition suivante :

 
Sélectionnez
fid = fopen(<vos arguments>);
if fid == -1
    % échec de l'ouverture
else
    % succès de l'ouverture, on peut débuter la lecture/écriture
end

À noter que la fonction fopen renvoie un second paramètre errmsg permettant de connaître la raison de l'échec.

 
Sélectionnez
[fid errmsg] = fopen(<vos arguments>);

Dans la plupart des cas, cette erreur est due à un chemin de fichier incorrect ou à des droits d'accès insuffisants.

Créé le 13 août 2014  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsque l'on passe aux fonctions setDocumentation fonction set ou getDocumentation fonction get l'identifiant (ou handleQu'est-ce qu'un handle ?) d'un objet graphique qui n'est pas ou plus valide. Ceci peut être dû au fait que :

  • l'objet auquel il est attaché (ou son parent) a été supprimé (objet FigureDocumentation objet Figure fermé, deleteDocumentation fonction delete utilisé…) ;
  • le handle a été remplacé par une nouvelle valeur. Une erreur de débutant consiste à faire :

     
    Sélectionnez
    handles.TagObjet = valeur
    % Au lieu de
    set(handles.TagObjet,'propriété',valeur)

    ce qui écrase le handle de l'objet par la valeur, le rendant ainsi invalide.

Dans tous les cas, on pourra vérifier la validité du handle avec la fonction ishandleDocumentation fonction ishandle.

Mis à jour le 2 mai 2013  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient dans le cas d'une opération matricielle non conforme, classiquement une addition ou une soustraction.

MATLAB suit les règles du calcul matriciel.

Dans le cas d'une addition ou d'une soustraction matricielle, les dimensions des deux matrices doivent être identiques

 
Sélectionnez
>> A = rand(4,2);
>> B = rand(4,2);
>> A+B

ans =

    0.0878    1.2452
    0.3911    0.6584
    0.6930    0.7345
    1.5735    1.0714

>> A-B

ans =

    0.0640    0.6228
   -0.2832   -0.3986
    0.3686    0.4032
   -0.0151   -0.1326

>> C = rand(3,5);
>> A+C
??? Error using ==> plus
Matrix dimensions must agree.

>> A-C
??? Error using ==> minus
Matrix dimensions must agree.

Note : cette erreur peut aussi survenir lorsqu'on tente d'utiliser l'opérateur de division matriciel (fonction mrdivideDocumentation fonction mrdivide, opérateur /) au lieu de l'opérateur de division membre à membre (fonction rdivideDocumentation fonction rdivide, opérateur ./).

 
Sélectionnez
>> A = [1 2 3 ; 4 5 6];
>> 1/A
??? Error using ==> mrdivide
Matrix dimensions must agree.

>> 1./A

ans =

    1.0000    0.5000    0.3333
    0.2500    0.2000    0.1667
Mis à jour le 21 mars 2012  par Jérôme Briot, Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient dans le cas d'une opération matricielle non conforme, classiquement une élévation à la puissance d'une matrice.

MATLAB suit les règles du calcul matriciel.

Dans le cas de l'élévation à la puissance d'une matrice, la matrice doit être carrée (le nombre de lignes et de colonnes est identique).

 
Sélectionnez
>> A = rand(5,5);
>> A^4

ans =

    2.1257    5.9293    5.2423    2.1951    5.0029
    4.1972   12.0853   10.5685    4.4972   10.2908
    3.2423    9.3624    8.1696    3.4970    7.9987
    1.3407    3.9289    3.3998    1.4956    3.4211
    2.6364    7.6644    6.6571    2.9055    6.6313

>> A = rand(5,3);
>> A^4
??? Error using ==> mpower
Matrix must be square.

Note : cette erreur peut survenir lorsqu'on tente d'élever non pas la matrice entière à une certaine puissance, mais chacun de ses éléments. Dans ce cas, il faut utiliser l'opérateur .^ (fonction powerDocumentation fonction power) à la place de ^ (fonction mpowerDocumentation fonction mpower) :

 
Sélectionnez
>> A = [1 2 3 ; 4 5 6]

A =

     1     2     3
     4     5     6

>> A.^3

ans =

     1     8    27
    64   125   216
Créé le 1er juillet 2010  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?
Lien : Quelle est la différence entre ' et .' ?

Cette erreur intervient lorsqu'une ou plusieurs fonctions s'appellent récursivement, et que le niveau de récursion atteint la limite fixée par MATLAB qui est de 500 par défaut, ceci afin d'éviter un débordement de la pile.

Selon le cas,

  • vous avez créé une récursion infinie : il vous faudra donc revoir votre condition d'arrêt ;

  • ce niveau de récursion est justifié : vous avez la possibilité d'augmenter cette limite avec cette ligne

     
    Sélectionnez
    set(0, 'RecursionLimit', nouvelleLimite)

    mais cela peut faire crasher MATLAB ou votre PC en fonction des limites de votre système.
    Il y a de fortes chances que vous deviez revoir votre algorithme.

Créé le 26 juin 2013  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Cette entrée de la FAQ MATLAB regroupe les solutions pour les messages d'erreur suivants :

Cas général

Sous MATLAB, les fonctions possèdent nécessairement une première ligne de définition selon ce modèle :

 
Sélectionnez
function [argout1, argout2, …] = fun(argin1, argin2, argin3, …)

argout1, argout2, … sont les arguments de sortie de la fonction et argin1, argin2, argin3, … sont les arguments d'entrée de la fonction. La présence de ces arguments n'est pas obligatoire. Une fonction peut n'avoir que des arguments d'entrée ou de sortie, voire ni l'un ni l'autre.

Les messages d'erreur qui nous intéressent ici, apparaissent pour des fonctions qui testent le nombre d'argument d'entrée (avec les fonctions nargchkDocumentation fonction nargchk, narginDocumentation fonction nargin et nargoutDocumentation fonction nargout). Ce qui est toujours le cas avec les fonctions MATLAB.

Les différents messages signifient donc :

  • Not enough input arguments : le nombre d'argument d'entrée n'est pas suffisant
  • Too many input arguments : le nombre d'argument d'entrée est trop grand
  • Too many output arguments : le nombre d'argument de sortie est trop grand

Par exemple avec la fonction size (qui renvoie les dimensions d'un tableau) :

 
Sélectionnez
>> size
??? Error using ==> size
Not enough input arguments.

>> X = rand(5,3);
>> size(X,1,2,3)
??? Error using ==> size
Too many input arguments.

Pour les fonctions MATLAB, il suffit de lire la documentation pour connaitre le nombre d'arguments acceptés par une fonction.

Dans le cas de la fonction sizeDocumentation fonction size, la documentation stipule (doc size) :

Syntaxe

  • d = size(X)
  • [m,n] = size(X)
  • m = size(X,dim)
  • [d1,d2,d3,…,dn] = size(X)

On remarque donc clairement que la fonction size accepte au maximum deux arguments d'entrée et un nombre « infini » d'arguments de sortie.

Autre cas de figure

Il existe un autre cas beaucoup plus difficile à détecter si vous utilisez la commande loadDocumentation fonction load sur un fichier contenant une variable nommée comme un nom de fichier.

Exemple :
1/ Créer un fichier MAT contenant la variable reshape :

 
Sélectionnez
reshape = 1;
save fichier reshape

2/ Créer la fonction suivante :

 
Sélectionnez
function y = mafonction
load fichier.mat;
y = reshape * 2;

3/ Appeler la fonction ainsi créée :

 
Sélectionnez
y = mafonction
??? Error using ==> reshape
Not enough input arguments.

Error in ==> mafonction at 3
y = reshape * 2;

Une solution de contournement serait de créer la variable avant le chargement du fichier.

 
Sélectionnez
function y = mafonction
reshape = [];
load fichier.mat;
y = reshape * 2;

Mais le mieux est encore de vérifier avant de choisir le nom de ses variables que ce nom n'est pas un nom de fonction existante.

Mis à jour le 27 septembre 2012  par Caro-Line

Lien : Conventions de noms : variablesBonnes pratiques de codage sous MATLAB
Lien : Conflicts with Function Names
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient généralement lors de la lecture d'un fichier texte avec la fonction load.

Pour rappel, la fonction loadDocumentation fonction load ne peut être utilisée pour lire des fichiers textes que si ces derniers ne contiennent que des valeurs numériques et seulement si chaque ligne du fichier contient le même nombre de colonnes.

Soit le fichier test.txt suivant :

 
Sélectionnez
1 2 3
4 5 6
7

La fonction load échoue :

 
Sélectionnez
>> load test.txt
??? Error using ==> load
Number of columns on line 2 of ASCII file D:\dvp\codesforum\test.txt
must be the same as previous lines.

La solution consiste ici soit à utiliser des fonctions de plus bas niveau comme fopenDocumentation fonction fopen / fgetlDocumentation fonction fgetl / fcloseDocumentation fonction fclose ou de haut niveau plus flexibles comme textreadDocumentation fonction textread ou textscanDocumentation fonction textscan.

Cette erreur survient aussi si le fichier contient des valeurs numériques précédées d'une (ou plusieurs) ligne d'entête, il faut alors utiliser une autre fonction comme par exemple dlmreadDocumentation fonction dlmread.

Par exemple avec le fichier test.txt suivant :

 
Sélectionnez
Un fichier
1 2 3
4 5 6
7 8 9

La fonction load échoue :

 
Sélectionnez
>> load test.txt
??? Error using ==> load
Number of columns on line 1 of ASCII file D:\dvp\codesforum\test.txt
must be the same as previous lines.

Alors qu'avec dlmread :

 
Sélectionnez
>> dlmread('test.txt',' ',1,0)

ans =

     1     2     3
     4     5     6
     7     8     9
Créé le 6 février 2011  par Jérôme Briot

Lien : Comment passer l'entête d'un fichier texte en lecture ?
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsqu'on tente d'utiliser les opérateurs && et || dits de courts-circuits avec des tableaux de valeurs alors qu'ils n'acceptent que des scalaires.

 
Sélectionnez
>> A = [true , true , false, false];
>> B = [true , false, true , false];
>> A || B % deux tableaux => ERREUR !
??? Operands to the || and && operators must be convertible to logical scalar values.

>> A && B(1)	% un tableau et un scalaire => ERREUR !
??? Operands to the || and && operators must be convertible to logical scalar values.

>> A(1) || B(1) % deux scalaires => OK

ans =

     1

Selon le comportement voulu, on utilisera :

  • soit les opérateurs | et & qui vont appliquer les opérateurs OU/ET sur chaque élément ;

     
    Sélectionnez
    >> A | B
    
    ans =
    
         1     1     1     0
    
    >> A & B
    
    ans =
    
         1     0     0     0
    
    >> A & B(1) % B(1) appliqué sur chaque élément de A
    
    ans =
    
         1     1     0     0
  • soit les fonctions anyDocumentation fonction any, allDocumentation fonction all qui prennent en compte tous les éléments ;

     
    Sélectionnez
    >> any(A) || any(B) % Au moins un élément "vrai" dans A ou B
    
    ans =
    
         1
    
    >> all(A) || all(B)	% Tous les éléments "vrais" dans A ou B
    
    ans =
    
         0
  • soit une combinaison des deux.

     
    Sélectionnez
    >> any(A & B)
    
    ans =
    
         1

Attention à l'utilisation de tableaux dans des conditions if ou while : tous les éléments doivent être vrais pour que la condition soit vraie.

Créé le 28 octobre 2012  par Jérôme Marsaguet

Lien : Quelle est la différence entre les opérateurs logiques & et | et les opérateurs logiques && et || ?
Lien : Logical Operations
Lien : Comment exploiter les messages d'erreurs ?

Quelque soit la fonction, cette erreur signifie que MATLAB ne trouve pas la place suffisante dans la mémoire de l'ordinateur pour stocker une variable. La taille maximale d'une variable dans MATLAB ne correspond pas à la quantité de mémoire disponible. MATLAB est spécialisé dans le calcul matriciel, sa gestion de la mémoire est différente des autres langages de programmation. Une variable doit être stockée dans un bloc de mémoire contigue (non fragmentée). Donc, la taille maximum d'une variable correspond, à un instant donné, à la taille du plus gros bloc de mémoire contiguë.

L'encombrement du workspace de MATLAB avec de nombreuses variables peut réduire la taille des blocs de mémoire contiguë disponibles.

Sous Windows, le chargement de nombreux programmes au démarrage du système peut résulter en une mémoire très fragmentée et donc en des blocs de mémoires contiguë de tailles réduites.

Quelques éléments de solutions :

  1. Optimiser les programmes en nettoyant les variables devenues inutiles ;
  2. Éviter d'utiliser des variables intermédiaires. Écraser les variables dont les valeurs sont devenues inutiles ;
  3. Arrêter tous les programmes inutiles de la session Windows, démarrer MATLAB sans la Machine Java (-nojvm), redémarrer Windows en mode sans échec, etc.
Mis à jour le 27 septembre 2012  par Jérôme Briot

Lien : Comment déterminer approximativement la quantité de mémoire nécessaire pour le stockage d'une variable ?
Lien : Avoiding Out of Memory Errors
Lien : Memory Management Guide
Lien : Maximum Matrix Size by Platform
Lien : Strategies for Efficient Use of Memory
Lien : Resolving "Out of Memory" Errors
Lien : How do I increase the largest contiguous free memory block available in MATLAB on a 32-bit machine running Windows XP SP2?
Lien : How can I view only the largest contiguous free memory block using system_dependent('dumpmem') in MATLAB 7.1 (R14SP3) on Windows?
Lien : Handling Large Data Sets Efficiently in MATLAB
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient lorsque l'on essaie d'affecter à une variable le résultat d'une fonction dont l'argument de sortie correspondant n'a reçu aucune valeur dans le code de la fonction.

Par exemple, prenons le cas d'une fonction avec un argument de sortie non affecté dans le corps de la fonction :

 
Sélectionnez
function c = mafonction(a,b)

if b > 0
    a+b;
else
    a-b;
end

On remarque bien qu'aucune valeur n'est affectée à la variable c.

À l'appel de la fonction avec son argument de sortie, on obtient donc :

 
Sélectionnez
>> c = mafonction(1,2)
Error in ==> mafonction at 3
if b > 0

??? Output argument "c" (and maybe others) not assigned during call to "mafonction.m>mafonction".
Créé le 1er juillet 2010  par Jérôme Briot

Cette erreur intervient lors de manipulation de structures, et plus précisément lorsqu'on tente d'accéder à un champ qui n'est pas présent dans la structure actuelle.

 
Sélectionnez
maStruct = struct('Nom', {'Dupond','Durant'}, 'Age', {23,36})

maStruct =

1x2 struct array with fields:
    Nom
    Age

Ici maStruct contient seulement les champs « Nom » et « Age », et donc si l'on veut par exemple obtenir le « Prenom » :

 
Sélectionnez
maStruct.Prenom
??? Reference to non-existent field 'Prenom'.

Il est possible de tester l'existence d'un champ de structure à l'aide de la fonction isfieldDocumentation fonction isfield.

Créé le 13 juin 2011  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Ce message s'affiche généralement lorsque vous avez supprimé un ou plusieurs éléments d'un objet listbox ou popupmenu.

Il signifie que la sélection dans l'objet se trouve actuellement en dehors des limites du contenu de l'objet.

Exemple :

 
Sélectionnez
%Création d'une listbox avec 2 chaînes de caractères :
maListe = uicontrol('style','listbox',...
    'Position',[10 10 100 200],...
    'String',{'chaine1','chaine2'});
%On se positionne sur chaine2
set(maListe,'Value',2);
%Suppression de la chaine2
Strs = get(maListe,'String');
idx = strmatch('chaine2',Strs);
Strs(idx) = [];
set(maListe,'String',Strs); %==> Provoque le warning et empêche de voir le contenu de la listbox

Solution rapide pour supprimer le warning et voir le contenu de la listbox :

 
Sélectionnez
set(maListe,'Value',1);

En général cette opération de suppression se fait dans le callback d'un bouton « Supprimer » après que l'utilisateur a sélectionné son choix dans la liste. L'habitude est de se placer sur l'élément directement précédant l'élément supprimé.

 
Sélectionnez
%Récupération de la valeur
idx = get(maListe,'Value');
Strs = get(maListe,'String');
Strs(idx) = [];
% Nouvelle valeur :
if idx ~= 1
    idx = idx-1;
end
set(maListe,'String',Strs,'Value',idx);

Remarque : ceci est à adapter dans le cas de listbox à multi-sélection.

Créé le 24 juillet 2007  par Caro-Line

Lien : Comment exploiter les messages d'erreurs ?

L'indexage des tableaux ne peut s'effectuer que :

  • soit à l'aide de valeurs entières strictement positives (entre parenthèses après le nom de la variable), le premier élément est repéré par l'indice 1 :

     
    Sélectionnez
    >> a = [10 20 30 40]
    
    a =
    
         10     20     30     40
    
    >> a(1)
    
    ans =
    
         10
    
    >> a(1.5) = 2
    Warning: Subscript indices must be integer values.
    % Attempted to access a(1.5); index must be a positive integer or logical.
    
    >> a(-1) = 2
    Warning: Subscript indices must be integer values.
    ???  Index into matrix is negative or zero.
    % ou : Attempted to access a(-1); index must be a positive integer or logical.
    
    >> a(0) = 2
    ???  Index into matrix is negative or zero.
    % ou : Attempted to access a(0); index must be a positive integer or logical.
  • soit à l'aide de valeurs logiques (les éléments sont alors sélectionnés selon les valeurs « vraies ») :

     
    Sélectionnez
    a([true false false true])
    
    ans =
    
         1     4

Cette erreur peut aussi intervenir lorsque l'on utilise auparavant une variable portant le même nom qu'une fonction MATLAB, et que l'on souhaite par la suite utiliser la fonction (cette pratique est évidemment à éviter. Cf. Conventions de noms : variables).

 
Sélectionnez
plot = 42; % plot, fonction MATLAB est masquée par cette variable plot du même nom
x = 0:9;
y = rand(1, 9);
plot(x,y)  % On souhaite utiliser la fonction MATLAB ici, mais c'est notre
           % variable qui est utilisée : x et y sont alors considérés comme indices
??? Subscript indices must either be real positive integers or logicals.
Mis à jour le 13 août 2014  par Jérôme Briot, Jérôme Marsaguet

Lien : Méthodes d'indexageTutoriel Introduction à la gestion des matrices sous MATLAB
Lien : Qu'est-ce que l'indexage logique ?
Lien : Matrix Indexing
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lors de l'utilisation de tableaux de structures, et plus particulièrement lorsque l'on souhaite en réunir deux n'ayant pas strictement les mêmes champs.

Exemple :

 
Sélectionnez
>> s1 = struct('name', {'Durant', 'Dupond'}, 'age', {32 34})

s1 =

1x2 struct array with fields:
    name
    age

>> s2 = struct('name', {'Martin'})

s2 =

    name: 'Martin'

>> s1(3) = s2
??? Subscripted assignment between dissimilar structures.

>> [s1 s2]
??? Error using horzcat
CAT arguments are not consistent in structure field number.

Ici s1 contient les deux champs .name et .age alors que s2 ne contient que le champ .age. Un tableau de structure doit contenir des structures ayant toutes exactement les mêmes champs. Si ce n'est pas le cas, il faudra utiliser un tableau de cellules.

Créé le 12 juillet 2014  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Le nombre d'éléments du terme de droite d'une affectation est différent de celui demandé dans le terme de gauche

 
Sélectionnez
>> A = [1 2 ; 3 4]

A =

     1     2
     3     4

>> A(:,:) = rand(3,3)
??? Subscripted assignment dimension mismatch.

On prêtera donc une attention particulière à la taille des deux parties, à l'aide de la fonction sizeDocumentation fonction size.
Avec l'exemple précédent :

 
Sélectionnez
>> size(A(:,:))

ans =

     2     2

>> size(rand(3,3))

ans =

     3     3

Nous voyons donc bien qu'il sera difficile de faire rentrer neuf éléments à la place de quatre.

Hormis le cas particulier où la partie droite est un scalaire (où tous les éléments de la partie gauche seront affectés à ce scalaire), les deux parties devront être de la même taille.

Mis à jour le 26 juin 2013  par Jérôme Briot, Jérôme Marsaguet

Lien : Indexing
Lien : Comment exploiter les messages d'erreurs ?

Cette message signifie

  • soit qu'il y a une erreur de syntaxe sur la partie à gauche du signe « = » de la commande MATLAB.

    Par exemple :

     
    Sélectionnez
    >> a = [0 0 0]
    
    a =
    
         0     0     0
    
    >> a(1 = 5
    ??? a(1 = 5
            |
    Error: The expression to the left of the equals sign is not a valid target for an assignment.

    Dans cet exemple, on remarque immédiatement qu'il manque une parenthèse fermante dans l'expression de gauche : a(1) = 5.
    Une autre erreur souvent commise est

     
    Sélectionnez
    >> if a(1) = 0
    ??? if a(1) = 0
            |
    Error: The expression to the left of the equals sign is not a valid target for an assignment.

    Pour effectuer une comparaison, il faut utiliser l'opérateur « == ».

  • soit que la partie gauche ne peut pas être modifiée.
    Exemple typique d'une constante :

     
    Sélectionnez
    >> 2 = a(1);
    ??? 2 = a(1);
            |
    Error: The expression to the left of the equals sign is not a valid target for an assignment.
Créé le 2 mai 2013  par Jérôme Marsaguet, Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

La fonction reshapeDocumentation fonction reshape sert à redimensionner un vecteur ou un tableau.

Par exemple, pour transformer un tableau 6x2 en un tableau 3x4 :

 
Sélectionnez
>> X = rand(6,2)

X =

    0.0344    0.4898
    0.4387    0.4456
    0.3816    0.6463
    0.7655    0.7094
    0.7952    0.7547
    0.1869    0.2760

>> X = reshape(X,3,4)

X =

    0.0344    0.7655    0.4898    0.7094
    0.4387    0.7952    0.4456    0.7547
    0.3816    0.1869    0.6463    0.2760

Pour que MATLAB puisse faire le redimensionnement, il faut impérativement que le nombre d'éléments dans le tableau de départ soit identique au nombre d'éléments dans le tableau final.

Dans l'exemple précédent, le tableau possède initialement 12 éléments (2x6) et le tableau final aussi (3x4).

Si les dimensions des deux tableaux ne correspondent pas, MATLAB renvoie ce message d'erreur :

 
Sélectionnez
X = rand(2,6); % 2x6 => 12 éléments
X = reshape(X,3,5); % 3x5 => 15 éléments

??? Error using ==> reshape
To RESHAPE the number of elements must not change.

Notes : dans certain cas, il peut s'avérer délicat de calculer une des valeurs de redimensionnement, voire même impossible (valeur non déterminée). MATLAB peut quand même redimensionner le tableau si la dimension manquante peut être déterminée.

Par exemple, si l'on souhaite redimensionner un tableau 4xN en un tableau 2xM (ici M=2xN bien entendu) :

 
Sélectionnez
N = 20; % Choix arbitraire
X = rand(4,N); % X possède 4xN éléments
X = reshape(X,2,[]); % MATLAB détermine la valeur manquante [] comme 4xN/2

Pour ce faire, il faut bien entendu qu'il n'y ait qu'une seule dimension inconnue dans la fonction reshape. Dans le cas contraire, MATLAB retourne le message d'erreur suivant :

 
Sélectionnez
??? Error using ==> reshape
Size can only have one unknown dimension.
Mis à jour le 1er juillet 2010  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Ce message d'erreur est renvoyé lorsque la transposée d'une matrice 3D (ou plus) est demandée.

La solution consiste à concaténer la transposée de la décomposition en matrices 2D de la matrice de plus grande dimension.

Dans le cas d'une matrice 3D (sans valeur complexe) :

 
Sélectionnez
M = rand(5,7,3);
X = cat(3,M(:,:,1).',M(:,:,2).',M(:,:,3).');

ou :

 
Sélectionnez
M = rand(5,7,3);

X = M(:,:,1).';

for n = 2:size(M,3)
    X = cat(3,X,M(:,:,n).');
end
Mis à jour le 29 juin 2008  par Jérôme Briot

Lien : Comment obtenir la transposée d'une image RGB ?
Lien : Comment exploiter les messages d'erreurs ?

Ce message d'erreur est essentiellement rencontré avec les objets graphiques ImageDocumentation objet Image, PatchDocumentation objet Patch ou SurfaceDocumentation objet Surface dont la couleur est donnée en couleurs vraies (de type RGB par exemple).

Dans la pratique, on stocke généralement ce type de couleurs dans des tableaux MxNx3 d'entiers de classe uint8 ou uint16. La plage de chaque valeur est de [0 255] pour les uint8 et de [0 65535] pour les uint16.

Par exemple, le triplet RGB correspondant à la couleur rouge sera [255 0 0] en uint8 et [65535 0 0] en uint16.

Or sous MATLAB, les couleurs vraies doivent êtres stockées (par l'intermédiaire de la propriété CData des objets graphiques) sous forme de valeurs réelles dans l'intervale [0 1].

Par exemple, soit l'image suivante composée de 4 pixels :

 
Sélectionnez
>> X = cat(3,[255 0 ; 0 255],[0 0 ; 255 255],[0 255 ; 255 0])

X(:,:,1) =

   255     0
     0   255


X(:,:,2) =

     0     0
   255   255


X(:,:,3) =

     0   255
   255     0
 
Sélectionnez
>> image(X)
??? Error using ==> image
Error using ==> image
TrueColor CData contains element out of range 0.0 <= value <= 1.0

Il faut ramener les valeurs dans l'intervale [0 1] en les divisant.

Par exemple en faisant ici :

 
Sélectionnez
image(X/255)
Créé le 6 février 2011  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur signifie que MATLAB ne parvient pas à trouver le fichier passé en argument de la fonction courante.

Deux causes sont possibles : soit le fichier n'existe effectivement pas, soit le fichier se trouve dans un dossier qui n'est ni le dossier courant, ni un dossier connu dans les chemins de MATLAB.

Par exemple, soit un fichier test.txt se trouvant dans le dossier « D:\matlab\txt » et contenant une ligne avec les valeurs suivantes :

 
Sélectionnez
1 2 3 4

Si le dossier courant est le dossier D:\matlab, l'appel à la fonction suivante échouera :

 
Sélectionnez
>> load('test.txt')
??? Error using ==> load
Unable to read file test.txt: No such file or directory.

Une solution consiste à passer le chemin complet du fichier :

 
Sélectionnez
>> load('D:\matlab\txt\test.txt')

Une autre solution consiste à ajouter le chemin du dossier contenant le fichier aux chemins connus par MATLAB avec la fonction addpathDocumentation fonction addpath :

 
Sélectionnez
>> addpath('D:\matlab\txt\')
>> load('test.txt')
Créé le 6 février 2011  par Jérôme Briot

Lien : Comment concaténer le nom d'un fichier et celui d'un répertoire ?
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur signifie que le nombre de parenthèses (ou de crochets) ouvrantes n'est pas égal à celui des parenthèses (ou crochets) fermantes sur une ligne de code. Il y a donc soit au moins une parenthèse (ou crochet) ouvrante en trop, soit une parenthèse (ou crochet) fermante en moins sur la ligne de code en question.

Exemples :

 
Sélectionnez
>> a = ( [ 1 2 3 )
??? a = ( [ 1 2 3 )
                  |
Error: Unbalanced or unexpected parenthesis or bracket.

>> a = [ ( 1:3 ]
??? a = [ ( 1:3 ]
                |
Error: Unbalanced or unexpected parenthesis or bracket.

>> a = [ 1:3 ])
??? a = [ 1:3 ])
               |
Error: Unbalanced or unexpected parenthesis or bracket.
Créé le 1er juillet 2010  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur peut survenir lorsque :

  • MATLAB ne parvient pas à trouver la fonction : voir le 2) du sujet Undefined function or variable '***' ;
  • MATLAB parvient à la trouver, mais elle n'est pas définie pour le type d'argument rentré.

Exemples :

 
Sélectionnez
>> C = {1 2 3 4 5 6 7 8 9 10};
>> C<5	% (lt pour less than) non définie pour une cellule
??? Undefined function or method 'lt' for input arguments of type 'cell'.

>> cellfun(@(x) x<5, C) % Il faut utiliser cellfun pour accéder aux valeurs

ans =

     1     1     1     1     0     0     0     0     0     0

>> C{5} == 5 % ou les accolades sur une cellule isolée

ans =

     1
 
Sélectionnez
>> donnees = {...
    'Dupond' , 'Durant'
   'Fernand' ,  'Eric'
       36    ,    24};
>> fprintf('%s : %s %d\n', donnees) % La fonction fprintf ne prend que des tableaux numériques en entrée
??? Error using ==> fprintf
Function is not defined for 'cell' inputs.

>> fprintf('%s %s %d\n', donnees{:}) % On utilise les accolades pour accéder aux éléments des cellules
Dupond Fernand 36
Durant Eric 24

Correspondance entre les opérateurs et leur nom dans le message d'erreur :

Nom Opérateur Nom Opérateur
eq A == B uminus -A
ne A ~= B times A .* B
ge A >= B mtimes A * B
gt A > B rdivide A ./ B
le A <= B mrdivide A / B
lt A < B ldivide A .\ B
plus A + B mldivide A \ B
uplus +A power A .^ B
minus A - B mpower A ^ B
Mis à jour le 12 avril 2017  par Jérôme Marsaguet

Lien : Undefined function or variable '***'.
Lien : Exporting a Cell Array to a Text File
Lien : Comment exploiter les messages d'erreurs ?

Cette erreur survient quand MATLAB ne trouve pas soit la fonction, soit la variable appelée.

1) Variable non définie

Le cas de la variable non définie est assez simple à comprendre par l'exemple suivant :

 
Sélectionnez
>> clear all 	% On supprime toutes les variables
>> v		% On appelle la variable v qui n'existe pas
??? Undefined function or variable 'v'.

Pensez à vérifier l'orthographe et la casse de la variable en question.

2) Fonction non définie

Le cas de la fonction non définie peut provenir de plusieurs facteurs à vérifier dans l'ordre suivant :

  • une erreur de frappe sur le nom de la fonction lors de l'appel ;
    vérifiez bien le nom de la fonction.

  • Le fichier contenant la fonction n'existe pas ;
    pour vérifier l'existence de la fonction, on utilise la fonction whichDocumentation fonction which :

     
    Sélectionnez
    which <nom de la fonction> -all

    Si MATLAB ne renvoie aucun chemin, mais que vous êtes néanmoins certain que le fichier .m est bien présent sur votre ordinateur, passez au point suivant.

  • Le fichier .m contenant la fonction se trouve dans un dossier qui n'est pas le dossier courant et qui n'est pas connu par MATLAB. La liste des chemins où MATLAB cherche les fonctions lors de leur appel est disponible avec la fonction pathDocumentation fonction path.

    Pour corriger ce problème, il faut ajouter le chemin du dossier qui contient le fichier .m avec la fonction addpathDocumentation fonction addpath :

     
    Sélectionnez
    >> addpath(<chemin du dossier contenant le fichier m>)

    Pour sauvegarder ce nouveau chemin d'une session MATLAB à une autre, il faut utiliser la fonction savepathDocumentation fonction savepath :

     
    Sélectionnez
    >> addpath(<chemin du dossier contenant le fichier m>);
    >> savepath



    Note 1 : ces manipulations sont très utiles lors du téléchargement de Toolbox ou de fichiers trouvés sur Internet (voir Comment utiliser une Toolbox ?).

    Note 2 : ces manipulations peuvent aussi se faire via le menu « File > Set Path… » de MATLAB.

  • Le nom de la fonction n'est pas le même que celui du fichier. Et, comme le soulignera MATLAB par le warning suivant :

     
    Sélectionnez
    function name <nom de la fonction> will be known to MATLAB by its file name : <nom du fichier>

    la fonction sera connue sous le nom du fichier au lieu de son propre nom. On veillera donc dans un souci de clarté à nommer les deux identiquement.

  • Enfin, il faut savoir que seule la première fonction définie dans un fichier .m sera connue extérieurement. Les autres sous-fonctions n'étant présentes que pour aider à son seul bon fonctionnement. Si l'on souhaite pouvoir les appeler, il faut soit faire passer leur handle (voir Que représente le symbole @ ?), soit les mettre dans un autre fichier .m.
Mis à jour le 13 août 2014  par Jérôme Briot, Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?
Lien : Comment utiliser une Toolbox ?
Lien : Could not find an exact (case-sensitive) match for ***.

Cette erreur survient généralement avec la fonction loadDocumentation fonction load lors de la lecture d'un fichier texte.

Pour rappel, la fonction load ne peut être utilisée pour lire des fichiers textes que si ces derniers ne contiennent que des valeurs numériques et seulement si chaque ligne du fichier contient le même nombre de colonnes.

Dans le cas qui nous intéresse ici, l'erreur apparait quand des valeurs non numériques sont présentes au milieu des valeurs numériques.

Par exemple avec le fichier test.txt suivant :

 
Sélectionnez
1 2 A 4
5 6 B 7

La lecture avec load échouera :

 
Sélectionnez
>> load test.txt
??? Error using ==> load
Unknown text on line number 1 of ASCII file D:\dvp\codesforum\test.txt
"A".

La solution consiste ici soit à utiliser des fonctions de plus bas niveau comme fopenDocumentation fonction fopen / fgetlDocumentation fonction fgetl / fcloseDocumentation fonction fclose ou de haut niveau plus flexibles comme textreadDocumentation fonction textread ou textscanDocumentation fonction textscan.

Créé le 6 février 2011  par Jérôme Briot

Lien : Quelles sont les fonctions de lecture et écriture ?
Lien : Comment exploiter les messages d'erreurs ?

Ce message d'erreur signifie que deux variables de type vecteur passées en argument d'une fonction doivent avoir la même longueur, donc le même nombre d'éléments.

Cette erreur est souvent rencontrée avec la fonction de traçage plotDocumentation fonction lot :

 
Sélectionnez
>> x = rand(1,5)

x =

    0.8147    0.9058    0.1270    0.9134    0.6324

>> y = rand(1,3)

y =

    0.0975    0.2785    0.5469

>> plot(x,y,'r-')
??? Error using ==> plot
Vectors must be the same lengths.

Dans l'exemple ci-dessus, le vecteur y a cinq valeurs tandis que x n'en a que trois, la fonction plot ne pourra donc trouver aucune correspondance pour les éléments y(4) et y(5) dans le vecteur x.

Créé le 6 février 2011  par Jérôme Briot

Lien : Comment exploiter les messages d'erreurs ?

Cette erreur intervient lorsqu'une variable est utilisée comme une fonction.

Cela peut arriver lorsque vous utilisez une variable du même nom qu'une fonction, la fonction est alors masquée par cette variable :

 
Sélectionnez
>> nom_fonction = 2;    % Variable qui masque la fonction du même nom.
>> fun = @nom_fonction; % On souhaite obtenir le handle de la fonction, mais
                        % c'est la variable ci-dessus qui est utilisée.
??? Error: "nom_fonction" was previously used as a variable,
 conflicting with its use here as the name of a function or command.
 See MATLAB Programming, "How MATLAB Recognizes Function Calls That Use Command Syntax" for details.

Ceci est une pratique à éviter, voir Conventions de noms : variables.

Lorsque vous récupérez le handle d'une fonction à l'aide du symbole @Que représente le symbole @ ?, il ne faut pas réutiliser ce symbole sur la variable :

 
Sélectionnez
>> fun = @(<entrées>) <code>; % Définition de la fonction anonyme
>> fonction(@fun, <arguments>) % Erreur
??? Error: "fun" was previously used as a variable,
 conflicting with its use here as the name of a function or command.
 See MATLAB Programming, "How MATLAB Recognizes Function Calls That Use Command Syntax" for details.

>> fonction(fun, <arguments>) % OK

Certaines instructions peuvent porter à confusion et être considérées comme un appel de fonction utilisant la syntaxe « ligne de commande » (voir Qu'est-ce qu'un appel fonctionnel ?).

 
Sélectionnez
>> a = 10;
>> b = 2;
>> a - b % OK : soustraction 10 - 2
>> a-b   % OK : soustraction 10-2
>> a -b  % ERREUR : appel de fonction équivalent à : a('-b')
??? Error: "a" was previously used as a variable,
 conflicting with its use here as the name of a function or command.
 See MATLAB Programming, "How MATLAB Recognizes Function Calls That Use Command Syntax" for details.
Créé le 13 août 2014  par Jérôme Marsaguet

Lien : Comment exploiter les messages d'erreurs ?

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007-2017 Developpez LLC Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.