이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
슬라이스 변수
슬라이스 변수는 여러 개의 조각(슬라이스)으로 나눈 다음 서로 다른 워커에서 개별적으로 연산할 수 있는 변수입니다. 각 루프 반복은 배열 내 각각의 다른 슬라이스에 대해 작동합니다. 슬라이스 변수를 사용하면 클라이언트와 워커 간의 통신을 줄일 수 있습니다.
이 예제에서 워커는 A
의 요소에 f
를 각각 적용합니다.
parfor i = 1:length(A) B(i) = f(A(i)); end
슬라이스 변수의 특징
parfor
루프의 변수가 다음 특징을 갖는 경우에는 슬라이스 변수입니다.
첫 번째 수준의 인덱싱 유형 — 첫 번째 수준의 인덱싱은 괄호(
()
) 또는 중괄호({}
)입니다.고정 인덱스 목록 — 첫 번째 수준의 괄호 또는 중괄호 내에서 인덱스 목록은 지정된 모든 변수 항목에 대해 동일합니다.
인덱싱 형식 — 변수에 대한 인덱스 목록 내에서 정확하게 하나의 인덱스가 루프 변수와 관련이 있습니다.
배열 형태 — 배열은 일정한 형태를 유지합니다. 슬라이스 변수에 대한 대입에서 대입식의 우변은
[]
또는''
일 수 없습니다. 이들 연산자는 요소를 삭제하기 때문입니다.
첫 번째 수준의 인덱싱 유형. 슬라이스 변수의 경우 첫 번째 수준의 인덱싱은 괄호(()
) 또는 중괄호({}
)로 묶습니다.
나눠지거나 나눠지지 않은 배열에 대한 첫 번째 수준의 인덱싱 형식은 다음과 같습니다.
나눠지지 않음 | 나눠짐 |
---|---|
A.x | A(...) |
A.(...) | A{...} |
첫 번째 수준 이후의 수준에서는 모든 유효한 MATLAB® 인덱싱 유형을 사용할 수 있습니다.
여기서 왼쪽에 표시된 변수 A
는 나눠지지 않았으며 오른쪽에 표시된 변수는 나눠졌습니다.
A.q{i,12} A{i,12}.q
고정 인덱스 목록. 슬라이스 변수의 첫 번째 수준 인덱싱 내에서 인덱스 목록은 지정된 모든 변수 항목에 대해 동일합니다.
왼쪽의 변수 A
는 i
와 i+1
로 서로 다른 부분에 대해 요소가 참조되었으므로 A
는 나눠지지 않았습니다. 오른쪽 코드에서 변수 A
는 올바르게 나눠졌습니다.
나눠지지 않음 | 나눠짐 |
---|---|
parfor i = 1:k B(:) = h(A(i), A(i+1)); end | parfor i = 1:k B(i) = f(A(i)); C(i) = g(A{i}); end |
오른쪽 예제에서는 허용 가능한 동일한 루프에서 괄호와 중괄호를 모두 사용한 첫 번째 수준 인덱싱을 보여줍니다.
왼쪽 예제는 A
에 대한 요소 참조가 모든 곳에서 동일하게 이뤄지지 않으므로 A
를 나누지 않습니다. 오른쪽 예제는 A
와 B
를 모두 나눕니다. A
의 인덱싱은 B
의 인덱싱과 동일하지 않습니다. 그러나 A
와 B
에 대한 요소 참조는 개별적으로 일관되게 이루어집니다.
나눠지지 않음 | 나눠짐 |
---|---|
parfor i=1:10 b = A(1,i) + A(2,i) end | A = [ 1 2 3 4 5 6 7 8 9 10; 10 20 30 40 50 60 70 80 90 100]; B = zeros(1,10); parfor i=1:10 for n=1:2 B(i) = B(i)+A(n,i) end end |
인덱싱 형식. 슬라이스 변수에 대한 첫 번째 수준의 인덱싱 내에서 정확히 하나의 인덱싱 표현식 형식이 i
, i+k
, i-k
또는 k+i
입니다. 인덱스 i
는 루프 변수이고 k
는 정수 스칼라 상수 또는 단순한(인덱싱되지 않은) 브로드캐스트 변수입니다. 기타 모든 인덱싱 표현식은 양의 정수 상수, 단순한(인덱싱되지 않은) 브로드캐스트 변수, 중첩 for
루프 인덱스 변수, 콜론 또는 end
입니다.
i
를 루프 변수로 사용하면 왼쪽에 보이는 A
변수는 나눠지지 않고 오른쪽에 표시된 A
변수는 나눠집니다.
나눠지지 않음 | 나눠짐 |
---|---|
A(i+f(k),j,:,3) % f(k) invalid for slicing A(i,20:30,end) % 20:30 not scalar A(i,:,s.field1) % s.field1 not simple broadcast var | A(i+k,j,:,3) A(i,:,end) A(i,:,k) |
루프 변수와 함께 다른 변수를 사용하여 배열의 요소를 참조하는 경우 루프 내에 이러한 변수를 설정할 수 없습니다. 사실상, 이러한 변수는 전체 parfor
문의 실행에서 일정합니다. 루프 변수를 그 자체와 결합하여 인덱스 표현식을 구성할 수 없습니다.
배열 형태. 슬라이스 변수는 일정한 형태를 유지해야 합니다. 여기에 표시된 변수 A
는 나눠지지 않았습니다.
A(i,:) = [];
슬라이스 배열의 형태를 변경하면 클라이언트와 워커 간의 통신에 대한 가정을 위반하기 때문에 A
는 나눠지지 않습니다.
슬라이스 입력 변수와 출력 변수
슬라이스 변수는 입력 변수, 출력 변수 또는 둘 다일 수 있습니다. MATLAB은 슬라이스 입력 변수를 클라이언트에서 워커로 전송하고 슬라이스 출력 변수를 워커에서 다시 클라이언트로 전송합니다. 변수가 입력과 출력에 모두 해당하는 경우 양방향으로 전송됩니다.
이 parfor
루프에서 A
는 슬라이스 입력 변수이고 B
는 슬라이스 출력 변수입니다.
A = rand(1,10); parfor ii = 1:10 B(ii) = A(ii); end
그러나 MATLAB이 각 반복에서 슬라이스 변수 요소가 사용 전에 설정된 것을 확인한 경우 MATLAB은 변수를 워커로 전송하지 않습니다. 이 예제에서는 A
의 모든 요소가 사용 전에 설정되었습니다.
parfor ii = 1:n if someCondition A(ii) = 32; else A(ii) = 17; end % loop code that uses A(ii) end
슬라이스 출력 변수는 중간 인덱스에 삽입된 디폴트 값을 사용하여 인덱스 할당을 통해 동적으로 증가할 수 있습니다. 이 예제에서는 디폴트 값 0이 A
의 여러 위치에 삽입되었음을 확인할 수 있습니다.
A = []; parfor idx = 1:10 if rand < 0.5 A(idx) = idx; end end disp(A);
0 2 0 4 5 0 0 8 9 10
명시적으로 슬라이스 변수가 입력값으로 참조되지 않은 경우에도 묵시적으로 그렇게 사용할 수 있습니다. 다음 예제에서는 A
의 모든 요소가 반드시 parfor
루프 내에 설정될 필요는 없습니다. 따라서 배열의 원래 값이 루프에서 수신되고 유지된 후 반환됩니다.
A = 1:10; parfor ii = 1:10 if rand < 0.5 A(ii) = 0; end end
경우에 따라 parfor
루프는 워커가 슬라이스 변수의 모든 조각을 필요로 할 수 있다고 가정해야 합니다. 이 예제에서는 슬라이스 변수의 어떤 요소가 읽혀질지 실행 전에 파악할 방법이 없으므로 parfor
는 모든 가능한 조각을 전송합니다.
A = 1:10; parfor ii=1:11 if ii <= randi([10 11]) A(ii) = A(ii) + 1; end end
슬라이스 변수가 있는 중첩 for
루프
중첩 for
루프 변수를 사용해 슬라이스 변수의 요소를 참조하는 경우 다음 요구 사항에 유의하십시오.
슬라이스 변수는 대응하는
for
루프 내에 포함되어야 합니다.이 예제에서 왼쪽 코드는
j
를 정의하는 중첩for
루프 밖에서 슬라이스 변수A
의 요소를 참조하기 때문에 작동하지 않습니다.나눠지지 않음 나눠짐 A = zeros(10); parfor i=1:10 for j=1:10 end A(i,j)=1; end
A = zeros(10); parfor i=1:10 for j=1:10 A(i,j) = 1; end end
for
루프 변수의 범위는 양의 상수 또는 변수로 구성된 행 벡터여야 합니다.이 예제에서 왼쪽 코드는 함수를 호출하여 중첩
for
루프의 상한을 정의하기 때문에 작동하지 않습니다. 오른쪽 코드는parfor
바깥쪽에 상수 변수에 상한을 정의함으로써 우회적 해결 방법을 제공합니다.나눠지지 않음 나눠짐 A = zeros(10); parfor i=1:10 for j=1:size(A,2) A(i,j)=1; end end
A = zeros(10); L = size(A,2); parfor i=1:10 for j=1:L A(i,j)=1; end end
for
루프 변수는for
문 이외의 명령문에 의해 할당되어서는 안 됩니다.이 예제에서 왼쪽 코드는
for
루프 변수를for
루프 내에서 다시 대입하기 때문에 작동하지 않습니다. 오른쪽 코드는i
를 임시 변수t
에 다시 할당함으로써 우회적인 해결 방법을 제공합니다.나눠지지 않음 나눠짐 A = zeros(10); parfor i=1:10 for j=1:10 if i == j j = i; A(i,j) = j; end end end
A = zeros(10); parfor i=1:10 for j=1:10 if i == j t = i; A(i,j) = t; end end end
데이터형 제한 사항
일부 MATLAB 데이터형은
parfor
루프에 대한 슬라이스 입력 또는 출력 변수로 사용할 수 없습니다. 변수를 슬라이스 변수로 사용하려면parfor
구현에서 인덱싱을 사용하여 변수를 확장할 수 있어야 합니다.다음 데이터형은 슬라이스 변수로 지원되지 않습니다.
dictionary
table
handle
객체로 구성된 슬라이스 배열을 사용하는 경우 MATLAB은 디폴트 요소를 구성합니다. 자세한 내용은 객체 배열을 만들고 초기화하기 항목을 참조하십시오.