Main Content

임시 변수

임시 변수는 인덱싱되지 않은 직접 할당의 대상이지만 귀결 변수는 아닌 모든 변수입니다. 다음 parfor 루프에서 ad가 임시 변수입니다.

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에서는 런타임 오류가 아닌 정적 오류가 발생합니다. 런타임 오류가 발생하는 것이 확실하다면 실행을 계속하는 것은 무의미합니다. 이런 종류의 오류는 종종 forparfor 사이의 혼동으로 인해, 특히 변수의 분류 규칙과 관련하여 발생합니다. 예를 들면 다음과 같습니다.

b = true;
parfor i = 1:n
    if b && some_condition(i)
        do_something(i);
        b = false;
    end
    ...
end

이 루프는 일반적인 for 루프로도 가능합니다. 하지만 parfor 루프를 사용하면 b는 임시 변수이고 루프 내 할당 대상으로서 그 즉시 발생합니다. 따라서 각 반복 시작 시 지워지므로 if 조건 내에서 초기화되지 않은 상태로 사용할 수 있습니다. parforfor로 변경하는 경우 b 값은 루프의 순차 실행을 가정합니다. 이런 경우 do_something(i)bfalse로 설정될 때까지 i의 낮은 값에 대해 실행됩니다.

귀결 변수로 사용하려고 의도한 임시 변수

초기화되지 않은 임시 변수가 발생하는 다른 일반적인 원인은 귀결 변수로 사용하려고 의도한 변수가 있는 경우입니다. 하지만 루프의 다른 곳에서 이 변수를 사용하면 임시 변수로 분류됩니다. 예를 들면 다음과 같습니다.

s = 0;
parfor i = 1:n
    s = s + f(i);
    ...
    if (s > whatever)
       ...
    end
end

본문의 첫 번째 명령문에 나오는 s가 2개인 경우 s는 귀결 변수로 분류됩니다. 하지만 이 예제에서 s는 귀결 변수가 아닌데, 그 이유는 s > whatever 라인에서 귀결 변수 할당을 벗어나 사용되고 있기 때문입니다. s는 (첫 번째 명령문에서) 할당 대상이므로 임시 변수입니다. 따라서 MATLAB이 오류를 발생시키지만 귀결 변수와의 연관성에 대해 언급합니다.

parforfor로 변경하면 귀결 할당을 벗어난 s의 사용이 특정 순서로 수행되는 반복에 의존합니다. parfor 루프에서는 루프가 계속 진행되면서 귀결 변수의 값에 “영향을 받지 않는다”는 것이 중요합니다. 귀결 값은 루프가 끝난 다음에만 사용할 수 있습니다.

ans 변수

parfor 루프 본문 내에서 ans 변수는 임시 변수로 분류됩니다. 임시 변수에 대한 모든 고려 사항과 제한 사항이 ans에 적용됩니다. 예를 들어 parfor 루프 내부의 ans에 대한 할당은 루프 외부의 ans에 영향을 주지 않습니다.

관련 항목