임시 변수
임시 변수는 인덱싱되지 않은 직접 할당의 대상이지만 귀결 변수는 아닌 모든 변수입니다. 다음 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)
는 b
가 false
로 설정될 때까지 i
의 낮은 값에 대해 실행됩니다.
귀결 변수로 사용하려고 의도한 임시 변수
초기화되지 않은 임시 변수가 발생하는 다른 일반적인 원인은 귀결 변수로 사용하려고 의도한 변수가 있는 경우입니다. 하지만 루프의 다른 곳에서 이 변수를 사용하면 임시 변수로 분류됩니다. 예를 들면 다음과 같습니다.
s = 0; parfor i = 1:n s = s + f(i); ... if (s > whatever) ... end end
본문의 첫 번째 명령문에 나오는 s
가 2개인 경우 s
는 귀결 변수로 분류됩니다. 하지만 이 예제에서 s
는 귀결 변수가 아닌데, 그 이유는 s > whatever
라인에서 귀결 변수 할당을 벗어나 사용되고 있기 때문입니다. s
는 (첫 번째 명령문에서) 할당 대상이므로 임시 변수입니다. 따라서 MATLAB이 오류를 발생시키지만 귀결 변수와의 연관성에 대해 언급합니다.
parfor
를 for
로 변경하면 귀결 할당을 벗어난 s
의 사용이 특정 순서로 수행되는 반복에 의존합니다. parfor
루프에서는 루프가 계속 진행되면서 귀결 변수의 값에 “영향을 받지 않는다”는 것이 중요합니다. 귀결 값은 루프가 끝난 다음에만 사용할 수 있습니다.
ans
변수
parfor
루프 본문 내에서 ans
변수는 임시 변수로 분류됩니다. 임시 변수에 대한 모든 고려 사항과 제한 사항이 ans
에 적용됩니다. 예를 들어 parfor
루프 내부의 ans
에 대한 할당은 루프 외부의 ans
에 영향을 주지 않습니다.