Временная переменная является любой переменной, которая является целью прямого, неиндексированного назначения, но не является переменной сокращения. В следующем 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 за пределами цикла.