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