exponenta event banner

Временные переменные

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

Связанные темы