Contenu principal

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

Variables temporaires

Une variable temporaire est toute variable qui est la cible d'une affectation directe non indexée, mais qui n'est pas une variable de réduction. Dans la boucle parfor suivante, a et d sont des variables temporaires :

a = 0;
z = 0;
r = rand(1,10);
parfor i = 1:10
    a = i;          % Variable a is temporary
    z = z + i;
    if i <= 5
        d = 2*a;     % Variable d is temporary
    end
end

Contrairement au comportement d'une boucle for, MATLAB® efface toutes les variables temporaires avant chaque itération d'une boucle parfor. Pour garantir l’indépendance des itérations, les valeurs des variables temporaires ne peuvent pas être transmises d’une itération de la boucle à une autre. Par conséquent, les variables temporaires doivent être définies à l'intérieur du corps d'une boucle parfor, afin que leurs valeurs soient définies séparément pour chaque itération.

MATLAB ne renvoie pas de variables temporaires au client. Une variable temporaire dans une boucle parfor n'a aucun effet sur une variable portant le même nom qui existe en dehors de la boucle. Ce comportement est différent des boucles for ordinaires.

Temporaires non initialisés

Les variables temporaires dans une boucle parfor sont effacées au début de chaque itération. MATLAB peut parfois détecter des cas dans lesquels les itérations de boucle utilisent une variable temporaire avant qu'elle ne soit définie dans cette itération. Dans ce cas, MATLAB émet une erreur statique plutôt qu'une erreur d'exécution. Il est inutile de laisser l’exécution se poursuivre si une erreur d’exécution est inévitable. Ce type d'erreur survient souvent en raison d'une confusion entre for et parfor, notamment concernant les règles de classification des variables. Par exemple :

b = true;
parfor i = 1:n
    if b && some_condition(i)
        do_something(i);
        b = false;
    end
    ...
end

Cette boucle est acceptable comme une boucle for ordinaire. Cependant, en tant que boucle parfor, b est une variable temporaire car elle apparaît directement comme cible d'une affectation à l'intérieur de la boucle. Il est donc effacé au début de chaque itération, son utilisation dans la condition if est donc garantie d'être non initialisée. Si vous remplacez parfor par for, la valeur de b suppose une exécution séquentielle de la boucle. Dans ce cas, do_something(i) est exécuté uniquement pour les valeurs inférieures de i jusqu'à ce que b soit défini sur false .

Variables temporaires destinées à être des variables réductrices

Une autre cause courante de temporaires non initialisés peut survenir lorsque vous avez une variable que vous vouliez être une variable de réduction. Cependant, si vous l'utilisez ailleurs dans la boucle, il est alors classé comme une variable temporaire. Par exemple :

s = 0;
parfor i = 1:n
    s = s + f(i);
    ...
    if (s > whatever)
       ...
    end
end

Si les seules occurrences de s sont les deux de la première instruction du corps, s serait classé comme une variable de réduction. Mais dans cet exemple, s n'est pas une variable de réduction car elle a une utilisation en dehors des affectations de réduction dans la ligne s > whatever . Parce que s est la cible d'une affectation (dans la première instruction), il s'agit d'une affectation temporaire. Par conséquent, MATLAB génère une erreur, mais souligne le lien possible avec la réduction.

Si vous remplacez parfor par for, l'utilisation de s en dehors de l'affectation de réduction repose sur les itérations effectuées dans un ordre particulier. Dans une boucle parfor, il est important que la boucle « ne se soucie pas » de la valeur d’une variable de réduction au fur et à mesure de son exécution. Ce n'est qu'après la boucle que la valeur de réduction devient utilisable.

Variable ans

À l'intérieur du corps d'une boucle parfor, la variable ans est classée comme une variable temporaire. Toutes les considérations et restrictions relatives aux variables temporaires s'appliquent à ans . Par exemple, les affectations à ans à l'intérieur d'une boucle parfor n'ont aucun effet sur ans à l'extérieur de la boucle.

Voir aussi

Rubriques