Résoudre l’erreur : taille fixe à gauche mais taille variable à droite
Problème
Pour la génération de code, une variable est soit de taille fixe, soit de taille variable. Si le générateur de code peut déterminer que la taille d’une variable ne change pas, il fixe sa taille dans le code généré. Sinon, il autorise la variable à changer de taille. Si vous affectez une valeur de taille variable à une variable que le générateur de code a précédemment définie comme étant de taille fixe, il affiche l’une des erreurs suivantes :
Unable to make this assignment because dimension
dimension
is fixed size on the left side but variable size on the right
Unable to make this assignment because dimension
dimension
in element 'element
' is fixed size on the left side but variable size on the right
Unable to make this assignment because dimension
dimension
in field 'field
' is fixed size on the left side but variable size on the right
Solutions possibles
Pour résoudre cette erreur, essayez l’une des solutions suivantes.
Obliger les variables à avoir la même taille avec l’indexation explicite
Si vous n’avez pas besoin que la variable de droite soit de taille variable, vous pouvez l’obliger à avoir une taille fixe avec l’indexation explicite. Par exemple, supposons que vous ayez une fonction qui définit les variables A
et B
. A
est un scalaire de taille variable et B
est un scalaire de taille fixe. La génération de code échoue, car la fonction essaie d’affecter la variable de taille variable A
à la variable de taille fixe B
.
function out = varsizeError2(n) %#codegen coder.varsize("A",[1 1],[true true]); A = ones(n,n); B = 3; numel(B); if (n == 3) B = A; end out = B; end
Pour générer du code pour cette fonction, utilisez l’indexation explicite pour obliger A
à être un scalaire de taille fixe.
function out = varsizeExample2(n) %#codegen coder.varsize("A",[1 1],[true true]); A = ones(n,n); B = 3; numel(B); if (n == 3) B = A(1); end out = B; end
Autoriser la taille de la variable de gauche à varier avec coder.varsize
Utilisez coder.varsize
(MATLAB Coder) pour demander au générateur de code de traiter la variable de gauche de l’affectation comme étant de taille variable. Prenons l’exemple de cette fonction :
function out = varsizeError1(n) %#codegen A = ones(n,n); B = magic(3); numel(B); if (n == 3) B = A; end out = B; end
Le générateur de code identifie le tableau A
comme étant de taille variable, car la taille de A
dépend de la valeur en entrée. Il identifie B
comme étant de taille fixe, car ce tableau a une taille constante quant le code utilise B
en le passant à la fonction numel
. La génération de code échoue pour l’affectation B = A
, car A
est de taille variable et B
est de taille fixe. Pour résoudre cette erreur, utilisez coder.varsize
pour demander au générateur de code d’autoriser la taille de B
à varier.
function out = varsizeExample1(n) %#codegen A = ones(n,n); B = magic(3); coder.varsize("B"); numel(B); if (n == 3) B = A; end out = B; end
Empêcher l’expansion implicite
En cas d’opérations binaires sur des tableaux de tailles différentes mais compatibles, le générateur de code étend de manière implicite les tableaux pour qu’ils soient de même taille. Si vous affectez la sortie étendue de manière implicite d’une opération ou fonction binaire à une variable dont la taille est fixe et différente, le générateur de code peut produire une erreur. Prenons l’exemple de cette fonction :
function out = varsizeError3(n) %#codegen A = ones(n,1); B = ones(n,n); if n == 1 A = A+B; end out = A; end
La seconde dimension du tableau A
est de taille fixe. Pour effectuer l’opération A+B
, le générateur de code étend de manière implicite la seconde dimension de A
pour qu’elle corresponde à la seconde dimension de B
. Le résultat de A+B
est un tableau dont les deux dimensions sont de taille variable. La génération de code échoue, car le générateur de code ne peut pas affecter une variable dont la seconde dimension est de taille variable à une variable dont la seconde dimension est de taille fixe. Dans cet exemple, l’opération A+B
ne s’exécute que si les deux tableaux sont de dimension 1 x 1. Par conséquent, vous pouvez désactiver l’expansion implicite pour cette fonction avec coder.noImplicitExpansionInFunction
(MATLAB Coder) ou pour cette opération avec coder.sameSizeBinaryOp
(MATLAB Coder). Par exemple :
function out = varsizeExample3(n) %#codegen coder.noImplicitExpansionInFunction A = ones(n,1); B = ones(n,n); if n == 1 A = A+B; end out = A; end
Voir aussi
coder.varsize
(MATLAB Coder) | coder.noImplicitExpansionInFunction
(MATLAB Coder) | coder.sameSizeBinaryOp
(MATLAB Coder)
Rubriques
- Define Variable-Size Data for Code Generation (MATLAB Coder)
- Optimize Implicit Expansion in Generated Code (MATLAB Coder)
- Resolve Error: Arrays Have Incompatible Sizes (MATLAB Coder)