Main Content

슬라이스 변수

슬라이스 변수는 여러 개의 조각(슬라이스)으로 나눈 다음 서로 다른 워커에서 개별적으로 연산할 수 있는 변수입니다. 각 루프 반복은 배열 내 각각의 다른 슬라이스에 대해 작동합니다. 슬라이스 변수를 사용하면 클라이언트와 워커 간의 통신을 줄일 수 있습니다.

이 예제에서 워커는 A의 요소에 f를 각각 적용합니다.

parfor i = 1:length(A)
    B(i) = f(A(i));
end

슬라이스 변수의 특징

parfor 루프의 변수가 다음 특징을 갖는 경우에는 슬라이스 변수입니다.

  • 첫 번째 수준의 인덱싱 유형 — 첫 번째 수준의 인덱싱은 괄호(()) 또는 중괄호({})입니다.

  • 고정 인덱스 목록 — 첫 번째 수준의 괄호 또는 중괄호 내에서 인덱스 목록은 지정된 모든 변수 항목에 대해 동일합니다.

  • 인덱싱 형식 — 변수에 대한 인덱스 목록 내에서 정확하게 하나의 인덱스가 루프 변수와 관련이 있습니다.

  • 배열 형태 — 배열은 일정한 형태를 유지합니다. 슬라이스 변수에 대한 대입에서 대입식의 우변은 [] 또는 ''일 수 없습니다. 이들 연산자는 요소를 삭제하기 때문입니다.

첫 번째 수준의 인덱싱 유형. 슬라이스 변수의 경우 첫 번째 수준의 인덱싱은 괄호(()) 또는 중괄호({})로 묶습니다.

나눠지거나 나눠지지 않은 배열에 대한 첫 번째 수준의 인덱싱 형식은 다음과 같습니다.

나눠지지 않음나눠짐
A.xA(...)
A.(...)A{...}

첫 번째 수준 이후의 수준에서는 모든 유효한 MATLAB® 인덱싱 유형을 사용할 수 있습니다.

여기서 왼쪽에 표시된 변수 A는 나눠지지 않았으며 오른쪽에 표시된 변수는 나눠졌습니다.

A.q{i,12}                         A{i,12}.q

고정 인덱스 목록. 슬라이스 변수의 첫 번째 수준 인덱싱 내에서 인덱스 목록은 지정된 모든 변수 항목에 대해 동일합니다.

왼쪽의 변수 Aii+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를 나누지 않습니다. 오른쪽 예제는 AB를 모두 나눕니다. A의 인덱싱은 B의 인덱싱과 동일하지 않습니다. 그러나 AB에 대한 요소 참조는 개별적으로 일관되게 이루어집니다.

나눠지지 않음나눠짐
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

관련 항목