Il existe des moyens simple et très efficace pour optimiser son code.

 

1 – Pré-allocation des matrices

Il est préférable d’initialiser les matrices qui sont renseignées dans les boucles for.

 

Exemple :

Ce qu’il ne faut pas faire :

d = [];
for k = 1:10000
  d = [d k*3];
end

Ce qu’il faut faire :

d = ones(1,10000); % Initialisation
for k = 1:10000
  d(k) = k*3;
end

 

Coût d’une réallocation :

  • trouver de l’espace libre en mémoire;
  • recopier les données.

 

La vectorisation

Il est préférable de vectoriser les algorithmes plutôt que d’utiliser des boucles for.

 

Exemples :

Ce qu’il ne faut pas faire :

x = 0.01;
for k = 1:1001
  y(k) = exp(x);
  x = x + 0.01;
end

Ce qu’il faut faire :

x = 0.01:0.01:10;
y = exp(x);

 

Ce qu’il ne faut pas faire :

res = 1;
for k = 2:n
  res = res*k;
end

Ce qu’il faut faire :

res = prod(1:n);

 

Utilisation du calcul matriciel

Formaliser les calculs sous forme d’opérations matricielles.

Exemple

Ce qu’il ne faut pas faire :

d = sum(V.^2);

Ce qu’il faut faire :

d = V*V';

 

Cas pratique

Les calculs sont accélérés de façon conséquente en utilisant des opérations vectorielles en lieu et place des boucles.

 

Exemple :

Comparons les deux fonctions suivantes (la commande tic déclenche un chronomètre ; toc arrête le chronomètre et retourne le temps écoulé depuis tic) :

function t = test1(n)
% détermine le temps mis pour créer la liste des racines carrées des entiers compris entre 1 et n

tic ;

b = zeros(length(n));
for k = 1 : 1 : n
  b(k) = sqrt(k) ;
end

t = toc ;

end
Résultat:
>> temps_1 = test1(10000000)

temps_1 =
    1.8944
function t = test2(n)
% détermine le temps mis pour créer la liste
% des racines carrées des entiers compris entre 1 et n

tic ;

a = 1 : 1 : n ;
b = sqrt(a) ;

t = toc ;
end
Résultat:
>> temps_2 = test2(10000000)

temps_2 =
    0.0565

La compilation de la première fonction (1.8944s) est plus lente que celle de la deuxième (0.0565s).

 

Utilisation du profiler

 

MATLAB dispose d’un utilitaire appelé profiler qui est très précieux pour étudier les performances d’une ou plusieurs fonctions.

 

Profiler pour le test1

 

Profiler pour test2

 

Utilisation de la commande pcode

Lors de l’exécution d’un script, Matlab compile d’abord le fichier .m dans un format de type .p.

La compilation est plus lente lors de la première exécution du script, et plus rapide les fois d’après dès lors que le fichier .p est crée.

L’utilisateur peut créer son propre .p. Matlab dispose pour cela de la commande pcode:

pcode(‘test1.m’);

>> pcode('test1')
>> temps_1 = test1(10000000)

temps_1 =
    1.8872

>> temps_2 = test2(10000000)

temps_2 =
    0.0568

 

La compilation de la première fonction en pcode (1.88s) est plus rapide que celle en .m (1.89s).

Fichier Pcode

 

Ce fichier présente l’avantage d’être non éditable.