Временная переменная - это любая переменная, которая является целью прямого неиндексированного назначения, но не является переменной сокращения. В следующем 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
В отличие от поведения for-loop, MATLAB ® очищает любые временные переменные перед каждой итерацией parfor-луп. Чтобы обеспечить независимость итераций, нельзя передавать значения временных переменных из одной итерации цикла в другую. Поэтому временные переменные должны быть установлены внутри тела parfor-контур, чтобы их значения определялись отдельно для каждой итерации.
MATLAB не отправляет временные переменные обратно клиенту. Временная переменная в parfor-loop не влияет на переменную с тем же именем, которая существует вне цикла. Такое поведение отличается от обычного for-контуры.
Временные переменные в parfor-loop очищаются в начале каждой итерации. 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-loop, ans переменная классифицируется как временная переменная. Все соображения и ограничения для временных переменных применяются к ans. Например, назначения ans внутри parfor-loop не влияют на ans вне контура.