Peut-on utiliser « i » comme indice de boucle dans MATLAB ?

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 :

do i=0,9
   print*,i
end do

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.

Hobbes explique les nombres imaginaires à Calvin

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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>