Archives du mot-clé nombres complexes

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.