La question peut sembler bizarre pour la plupart des développeurs, surtout ceux qui ne codent pas avec MATLAB.
« i » comme indice de boucle
La variable « i » est couramment utilisée pour désigner l’indice des boucles en programmation informatique.
En C :
for(i=0;i<10;i++)
printf("%d\n", i);
En Fortran :
Avec MATLAB :
for i = 0:9
fprintf("%d\n", i);
Mais pourquoi utilise-t-on « i » au fait ? Certains y voient un héritage des notations mathématiques, d'autres du Fortran, ou alors un peu des deux, ou encore que « indice » et « index » commencent par i. Il n'y a, semble-t-il, pas de réponse absolue. Lire à ce sujet : Why are variables “i” and “j” used for counters?
« i » pour désigner les nombres complexes avec MATLAB
MATLAB est un outil initialement conçu pour le calcul numérique. A ce titre, il prend en compte les nombres complexes (et les calculs associés) depuis sa première version.
Pour définir une valeur complexe, on utilise la syntaxe suivante :
>> cmplx = 1 + 3i
cmplx =
1.0000 + 3.0000i
Le caractère « i » est obligatoirement placé après la valeur numérique de la partie imaginaire, sans aucun espace.
Sinon :
>> cmplx = 1+i3
Undefined function or variable 'i3'.
>> cmplx = 1 + 3 i
cmplx = 1 + 3 i
|
Error: Unexpected MATLAB expression.
Nombres complexes et boucle avec MATLAB
Pour mettre en évidence l’ambiguïté entre ces deux utilisations de « i », prenons un exemple simple :
for i = 1:4
X(1,i) = 1+3*i;
Y(1,i) = 1+3i;
end
Les variables X et Y contiennent-elles toutes les deux des valeurs complexes ?
Affichons leur contenu :
X =
4 7 10 13
Y =
1.0000 + 3.0000i 1.0000 + 3.0000i 1.0000 + 3.0000i 1.0000 + 3.0000i
Dans ce cas, X contient donc uniquement des valeurs réelles.
Que ce passe-t-il si on supprime la variable i et que l’on renomme la variable qui incrémente la boucle ?
clear i
for n = 1:4
X(1,n) = 1+3*i;
Y(1,n) = 1+3i;
end
Voici le contenu de X et Y :
X =
1.0000 + 3.0000i 1.0000 + 3.0000i 1.0000 + 3.0000i 1.0000 + 3.0000i
Y =
1.0000 + 3.0000i 1.0000 + 3.0000i 1.0000 + 3.0000i 1.0000 + 3.0000i
Aïe… les deux codes ont quasiment la même syntaxe, mais ne donnent pas du tout le même résultat !
Solution
Certains préconisent de ne jamais employer « i » comme indice de boucle. Oui pourquoi pas. Pour ma part, je ne suis convaincu par aucun dogme (MATLAB c’est mal…)
Pourquoi devrais-je donc impérativement ne pas utiliser « i » comme variable d’incrément dans mes codes ?
Il est vrai que j’utilise souvent « n », mais je ne saurais réellement dire pourquoi, si ce n’est par habitude. En traitement d’images, j’utilise parfois « r » et « c » pour désigner respectivement les lignes (rows) et les colonnes (columns) pour parcourir les pixels d’une image.
Solution robuste
Il y a en fait deux façons de créer un nombre complexe avec MATLAB, celle que l’on a vue précédemment et celle qui consiste à utiliser la fonction complex :
>> cmplx = complex(1,3)
cmplx =
1.0000 + 3.0000i
Dans ce cas, aucune ambiguïté, ni aucune chance pour que la définition du nombre complexe n’entre en conflit avec une variable i définie préalablement dans le code.
La fonction complex est également utile quand la partie imaginaire du nombre complexe est nulle.
En effet :
>> cmplx = 1+0i
cmplx =
1
>> isreal(cmplx)
ans =
1
Alors que :
>> cmplx = complex(1,0)
cmplx =
1
>> isreal(cmplx)
ans =
0
La première syntaxe renvoie une variable contenant une valeur réelle alors que la deuxième syntaxe renvoie une valeur complexe.
Conclusion
L’emploi du caractère « i » peut être source de confusion et d’erreur dans la syntaxe et l’exécution de code MATLAB.
Il n’y a pas de solution parfaite, mis à part l’utilisation de la fonction complex.
Dans tous les cas, c’est à vous, développeurs, de déterminer si l’ambiguïté peut apparaitre dans votre code et de la prendre en compte si besoin.
PS : ce billet fait suite à une remarque de tachmou dans la discussion Probleme incrementation boucle for du forum MATLAB.