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
- ")" expected, "End of Input" found.
- All matrices on a row in the bracketed expression must have the same number of rows.
- All rows in the bracketed expression must have the same number of columns.
- A MATLAB string constant is not terminated properly.
- A null assignment can have only one non-colon index.
- Assignment has more non-singleton rhs dimensions than non-singleton subscripts.
- Attempt to execute SCRIPT <filename> as a function.
- Attempt to reference field of non-structure array.
- Attempt to add "***" to a static workspace.
- Attempted to access variable(0); index must be a positive integer or logical.
- Attempted to access variable(n); index out of bounds because numel(variable)=(n-1).
- CAT arguments dimensions are not consistent.
- Cell contents assignment to a non-cell array object.
- Conversion to double from cell is not possible.
- Could not find an exact (case-sensitive) match for ***.
- Error while loading shared libraries: libmwmclmcrrt.so.7
- Expected a variable, function, or constant, found "|".
- Expected a variable, function, or constant, found "&".
- Expression or statement is incomplete or incorrect.
- Expression or statement is incorrect--possibly unbalanced (, {, or [.
- File *** is a script M-file and cannot be compiled with the current Compiler.
- Function definitions are not permitted at the prompt or in scripts.
- function keyword use is invalid here.
- Improper assignment with rectangular empty matrix.
- Improper index matrix reference.
- 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.
- In an assignment A(matrix,:) = B, the number of columns in A and B must be the same.
- 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.
- In an assignment A(I) = B, the number of elements in B and I must be the same.
- Index exceeds matrix dimensions.
- Index into matrix is negative or zero.
- Index of element to remove exceeds matrix dimensions.
- Indexing cannot yield multiple results.
- Inner matrix dimensions must agree.
- Input argument *** is undefined.
- Integers can only be combined with integers of the same class, or scalar doubles.
- Invalid file identifier. Use fopen to generate a valid file identifier.
- Invalid handle object.
- Matrix dimensions must agree.
- Matrix index is out of range for deletion.
- Matrix must be square.
- Maximum recursion limit of 500 reached
- Not enough input arguments.
- Number of columns on line * of ASCII file *** must be the same as previous lines.
- Operands to the || and && operators must be convertible to logical scalar values.
- Out of memory. Type HELP MEMORY for your options.
- Output argument "***" (and maybe others) not assigned during call to "***"
- Product of known dimensions, ***, not divisible into total number of elements, ***.
- Reference to non-existent field
- Single-selection listbox control requires that Value be an integer within String range. Control will not be rendered ...
- Subscript indices must either be real positive integers or logicals.
- Subscripted assignment between dissimilar structures.
- Subscripted assignment dimension mismatch.
- The expression to the left of the equals sign is not a valid target for an assignment.
- This statement is incomplete.
- Too many input arguments.
- Too many output arguments.
- To RESHAPE the number of elements must not change.
- Transpose on ND array is not defined.
- TrueColor CData contains element out of range 0.0 <= value <= 1.0
- Unable to read file ***: No such file or directory.
- Unbalanced or unexpected parenthesis or bracket.
- Undefined function or method *** for input arguments of type ***.
- Undefined function or variable '***'.
- Unknown text on line number * of ASCII file *** "*".
- Value must be a handle.
- Vectors must be the same lengths.
- *** was previously used as a variable, conflicting with its use here as the name of a function or command.
Erreur similaire à "Unbalanced or unexpected parenthesis or bracket.".
Ce message d'erreur n'existe plus depuis la version R2006a de MATLAB et a été remplacé par : CAT arguments dimensions are not consistent.
Ce message d'erreur n'existe plus depuis la version R2006a de MATLAB et a été remplacé par : CAT arguments dimensions are not consistent.
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.
>> 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 :
str = ['une ligne '
...
'qui continue '
...
'encore et encore'
]
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 :
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.
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.
M = rand(3,4,5,6,7);
M(:,:,4,:,:) = []; % une seule valeur : 4 => OK
size(M)
ans =
3 4 4 6 7
- 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 « : ».
>> 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.
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 :
which -all <filename>
Les deux solutions possibles sont :
- modifier le nom du fichier Script <filename> afin d'éviter le conflit de nom ;
- modifier le chemin de recherche (path) de MATLAB pour que la fonction MATLAB soit vue en premier.
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
maStruct = struct('Nom'
,'Dupond'
,'Age'
,23);
maStruct.Nom % renvoie Dupond
Mais
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 :
- 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 ;
-
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>)
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.mSélectionnez
my_var = 10;
exemple.mSélectionnezfunction
exemple() mon_script% appel à mon_script qui crée la variable my_var
% dans le workspace de la fonction exemple
deviendra :
ma_fonction.mSélectionnezfunction
my_var = ma_fonction() my_var = 10;exemple.mSélectionnezfunction
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) :
function
exemple()
my_var = [];
mon_script
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.
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 ?
Erreur similaire à Subscript indices must either be real positive integers or logicals..
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 :
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 :
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 :
>> str = ['A'
; 'B'
; 'C'
];
>> [str ','
]
??? Error using ==> horzcat
CAT arguments dimensions are not consistent.
La solution consiste à utiliser la fonction strcatDocumentation fonction strcat :
>> str = ['A'
; 'B'
; 'C'
];
>> strcat(str,','
)
ans =
A,
B,
C,
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 :
>> 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.
>> clear T
>> T{1} = 1:10;
On pourra vérifier qu'une variable est un tableau de cellules avec la fonction iscellDocumentation fonction iscell.
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.
>> 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à.
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 :
>> 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) :
>> 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 :
>> mafonction
??? Cannot find an exact (case-sensitive) match for 'mafonction'.
The closest match is: maFonction
in <chemin du fichier>\maFonction.m
Sous Linux, lors de l'exécution du programme compilé, l'erreur suivante apparait :
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 :
getenv('LD_LIBRARY_PATH'
)
Sous Linux, dans une fenêtre terminal :
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.
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 « | ».
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 « & ».
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 :
a = ;
donne :
??? Error: File: erreur.m Line: 1 Column: 5
Expression or statement is incomplete or incorrect.
Erreur similaire à "Unbalanced or unexpected parenthesis or bracket.".
Cette erreur survient à l'exécution suivante :
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 :
function
test
Note : le nom test doit bien entendu être remplacé par le nom de votre fichier.
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 :
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).
Erreur similaire à Function definitions are not permitted at the prompt or in scripts.
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.
>> 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 :
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
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 :
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.
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
>> 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.
>> 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.
Le nombre de lignes du terme de gauche est différent de celui de droite.
>> 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.
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
>> 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.
Un des indices demandés est supérieur au nombre total d'éléments dans le tableau.
>> a = [1 2 3 4]
a =
1 2 3 4
>> a(5)
??? Index exceeds matrix dimensions.
>> 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).
>> 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
Erreur similaire à "Subscript indices must either be real positive integers or logicals.".
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.
>> 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 :
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 :
for
k = taille_tab:-1:1
if
condition
tab(k) = [];
end
end
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 :
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.
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.
>> 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 .*).
>> 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
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 :
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 :
>> x = mafonction(1)
??? Input argument 'b' is undefined.
Lorsque vous appuyez sur le bouton « Run » (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.
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 :
>> 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 :
>> 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 :
>> A = uint8([1 2])
A =
1 2
>> B = uint16([3 4])
B =
3 4
>> uint16(A)+B
ans =
4 6
>> 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.
>> 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 :
>> class(C)
ans =
uint8
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 :
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.
[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.
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électionnezhandles.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.
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
>> 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 ./).
>> 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
Erreur similaire à Index of element to remove exceeds matrix dimensions.
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).
>> 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) :
>> A = [1 2 3 ; 4 5 6]
A =
1 2 3
4 5 6
>> A.^3
ans =
1 8 27
64 125 216
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électionnezset(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.
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 :
function
[argout1, argout2, …] = fun(argin1, argin2, argin3, …)
Où 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) :
>> 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 :
reshape = 1;
save fichier reshape
2/ Créer la fonction suivante :
function
y = mafonction
load fichier.mat
;
y = reshape * 2;
3/ Appeler la fonction ainsi créée :
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.
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.
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 :
1 2 3
4 5 6
7
La fonction load échoue :
>> 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 :
Un fichier
1 2 3
4 5 6
7 8 9
La fonction load échoue :
>> 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 :
>> dlmread('test.txt'
,' '
,1,0)
ans =
1 2 3
4 5 6
7 8 9
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.
>> 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.
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 :
- Optimiser les programmes en nettoyant les variables devenues inutiles ;
- Éviter d'utiliser des variables intermédiaires. Écraser les variables dont les valeurs sont devenues inutiles ;
- 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.
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 :
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 :
>> 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".
Erreur similaire à "To RESHAPE the number of elements must not change.".
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.
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 » :
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.
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 :
%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 :
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é.
%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.
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) = 2Warning: 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électionneza([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).
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.
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 :
>> 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.
Le nombre d'éléments du terme de droite d'une affectation est différent de celui demandé dans le terme de gauche
>> 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 :
>> 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.
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 estSé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.
Erreur similaire à "Expression or statement is incomplete or incorrect.".
La fonction reshapeDocumentation fonction reshape sert à redimensionner un vecteur ou un tableau.
Par exemple, pour transformer un tableau 6x2 en un tableau 3x4 :
>> 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 :
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) :
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 :
??? Error using ==> reshape
Size can only have one unknown dimension.
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) :
M = rand(5,7,3);
X = cat(3,M(:,:,1).',M(:,:,2).',M(:,:,3).');
ou :
M = rand(5,7,3);
X = M(:,:,1).';
for
n = 2:size(M,3)
X = cat(3,X,M(:,:,n).');
end
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 :
>> 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
>> 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 :
image(X/255)
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 :
1 2 3 4
Si le dossier courant est le dossier D:\matlab, l'appel à la fonction suivante échouera :
>> 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 :
>> 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 :
>> addpath('D:\matlab\txt\'
)
>> load('test.txt'
)
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 :
>> 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.
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 :
>> 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
>> 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 |
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 :
>> 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électionnezwhich
<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électionnezfunction 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.
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 :
1 2 A 4
5 6 B 7
La lecture avec load échouera :
>> 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.
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 :
>> 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.
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 :
>> 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 :
>> 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 ?).
>> 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.