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