Временные переменные

Временная переменная является любой переменной, которая является целью прямого, неиндексированного назначения, но не является переменной сокращения. В следующем parfor-цикл, a и d являются временными переменными:

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

В отличие от поведения a for-цикл, MATLAB® очищает все временные переменные перед каждой итерацией parfor-цикл. Чтобы помочь гарантировать независимость итераций, значения временных переменных не могут быть переданы от одной итерации цикла к другой. Поэтому временные переменные должны быть установлены внутри тела parfor-цикл, так что их значения задаются отдельно для каждой итерации.

MATLAB не отправляет временные переменные обратно клиенту. Временная переменная в parfor-loop не влияет на переменную с таким же именем, которое существует вне цикла. Такое поведение отличается от обычных for-циклы.

Неинициализированные временные диаграммы

Временные переменные в parfor-цикл очищаются в начале каждой итерации. MATLAB может иногда обнаруживать случаи, в которых итерации цикла используют временную переменную, прежде чем она будет установлена в этой итерации. В этом случае MATLAB выдает статическую ошибку, а не ошибку времени выполнения. Существует мало точка в том, чтобы разрешить выполнение, если ошибка времени выполнения гарантирована произойдет. Такой тип ошибки часто возникает из-за путаницы между for и parfor, особенно в отношении правил классификации переменных. Для примера:

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

Этот цикл приемлем как обычный for-цикл. Однако как parfor-цикл, b является временной переменной, поскольку она происходит непосредственно как цель назначения внутри цикла. Поэтому он очищается в начале каждой итерации, поэтому его использование в состоянии if гарантировано быть неинициализированным. Если вы меняете parfor на for, значение b принимает последовательное выполнение цикла. В этом случае do_something(i) выполняется только для нижних значений i до b задан false.

Временные переменные, предназначенные в качестве переменных сокращения

Другая распространенная причина неинициализированных временных периодов может возникнуть, когда у вас есть переменная, которая вы намеревались быть переменной сокращения. Однако, если вы используете его в другом месте цикла, то он классифицируется как временная переменная. Для примера:

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

Если единственные вхождения s являются ли два в первом операторе тела, s будет классифицирована как переменная сокращения. Но в этом примере s не является переменной сокращения, поскольку она используется вне назначений сокращения в линии s > whatever. Потому что s является целевым объектом назначения (в первом операторе), является временным. Поэтому MATLAB выдает ошибку, но указывает на возможную связь с сокращением.

Если вы меняете parfor на for, использование s вне назначения сокращения полагается на итерации, выполняемые в конкретном порядке. В parfor-loop, важно, чтобы цикл «не заботился» о значении переменной сокращения, пока она идет. Только после цикла значение сокращения становится полезным.

ans Переменная

Внутри тела parfor-цикл, ans переменная классифицируется как временная переменная. Все факторы и ограничения для временных переменных применяются к ans. Для примера, назначения ans внутри parfor-цикл не влияет на ans за пределами цикла.

Похожие темы