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