다음: 함수 호출, 상위 문서: 표현식   [차례][찾아보기]


8.1 색인 표현식

색인 표현식으로 선택한 벡터·행렬(2차원)·다차원 배열의 원소를 참조하거나 뽑아냅니다.

색인은 스칼라, 벡터, 범위, 행·열·고차원 면 전체를 지정하는 특수 연산자 ‘:’입니다.

색인 표현식은 괄호로 묶은 M 표현식을 반점으로 구분하여 구성합니다. 개별 색인 값와 요소는 색인하는 객체의 각 차원에 사용합니다. 환언하자면, 첫 번째 색인 요소는 객체의 첫 번째 차원(행)에 쓰고, 두 번째 색인 요소는 객체의 두 번째 차원(열)에 쓰는 방식입니다. 색인 요소 M의 개수는 색인 표현식의 차원수를 결정합니다. 색인 요소 두 개는 2차원이기 때문에, 2차원 색인을 합니다.

간단한 예시로, 1)모든 요소가 스칼라인 경우, 2)색인 표현식 M의 차원수가 색인하는 색체의 차원수와 같은 경우를 보겠습니다.

A = reshape (1:8, 2, 2, 2)  # Create 3-D array
A =

ans(:,:,1) =

   1   3
   2   4

ans(:,:,2) =

   5   7
   6   8

A(2, 1, 2)   # second row, first column of second slice
             # in third dimension: ans = 6

특정 차원인 객체의 크기가 맞물리는 색인 표현식의 요소와 개수가 같습니다. 모든 요소가 스칼라이면, 결과는 출력 값 하나입니다. 그러나 요소가 하나라도 벡터이거나 범위이면, 각 차원 색인의 곱집합을 반환합니다.

A([1, 2], 1, 2) ≡ [A(1,1,2); A(2,1,2)]
⇒
ans =
   5
   6

반환값의 전체 개수는 각 색인 요소에서 반환한 원소 개수의 곱입니다. 위 예시에서, 총 개수는 2*1*1 = 2 개입니다.

주어진 차원에서 반환한 객체의 크기와 해당 차원에 대한 색인 표현식의 원소 개수가 같습니다. 위 부호에서, 첫 번째 색인 요소([1, 2])가 행 벡터를 특정하나, 이 요소의 모양은 중요하지 않습니다. 중요한 사실은, 요소에 값 두 개가 있고, 이로 인하여 결과가 반드시 첫 번째 차원에서 두 개 크기이어야 한다는 점입니다. 왜냐하면, 첫 번째 차원이 행에 대응하고, 전체 결과는 열 벡터이기 때문입니다.

A(1, [2, 1, 1], 1)    # result is a row vector: ans = [3, 1, 1]
A(ones (2, 2), 1, 1)  # result is a column vector: ans = [1; 1; 1; 1]

첫 번째 줄이 주어진 차원의 출력의 크기가 각 색인 요소의 원소 개수와 같음을 다시 보여줍니다. 위 경우에는, 출력이 두 번째 차원(열에 대응)에서 원소 세 개를 가져, 결과가 행 벡터입니다. 또한, 예시는 색인 표현식에서 어귀 반복을 출력 내 원소 복제에 사용하는 방법을 보여줍니다. 마지막 예시는 색인 요소의 모양은 상관없고, 원소의 개수(2x2 = 4)만이 중요함을 강조하여 증명합니다.

위 규칙은 색인 표현식의 차원수가 1보다 크기만 하면(M > 1) 적용됩니다. 하지만, 1차원 색인 표현식에는 특별한 규칙이 적용되어 출력의 모양이 색인 요소의 모양으로 결정됩니다. 예시:

A([1, 2])  # result is a row vector: ans = [1, 2]
A([1; 2])  # result is a column vector: ans = [1; 2]

1차원 색인을 다차원 객체에서 사용하여도 됨(선형 색인이라고도 부름)에 유의하십시오. 이 경우에는 다차원 배열의 원소가 포트란에서처럼 열 우선 순서로 처리됩니다. 배열의 열을 다른 열 위에 쌓아 열 벡터를 이루고, 단일 선형 색인이 이 열 벡터에 적용하는 것입니다.

A(5)    # linear indexing into three-dimensional array: ans = 5
A(3:5)  # result has shape of index component: ans = [3, 4, 5]

쌍점(‘:’)을 특정 차원의 모든 원소를 모두 선택하는 색인 요소로 사용합니다. 아래 행렬에서

A = [1, 2; 3, 4]

아래 표현식을 사용하면, 모두 동일한 작업을 하여, 행렬의 첫 번째 행을 선택합니다.

A(1, [1, 2])  # row 1, columns 1 and 2
A(1, 1:2)     # row 1, columns in range 1-2
A(1, :)       # row 1, all columns

쌍점을 특별 경우인 1차원 색인에 사용하면, 색인 결과는 언제나 열 벡터입니다. 쌍점 색인으로 열 벡터 만들기는 매우 자주 보는 부호 표현이며, 1차원 색인에서 reshape을 호출하는 것보다 빠르고, 보통 더 명료합니다.

A(:)    # result is column vector: ans = [1; 2; 3; 4]
A(:)'   # result is row vector: ans = [1, 2, 3, 4]

색인 표현식에서 예약어 end는 특정한 차원의 마지막 어귀를 자동으로 참조합니다. 이 마술 색인은 범위에서도 사용하며, 색인 전에 배열 범위를 알기 위한 sizelength를 호출할 필요를 없앱니다. 예시:

A(1:end/2)        # first half of A => [1, 2]
A(end + 1) = 5;   # append element
A(end) = [];      # delete element
A(1:2:end)        # odd elements of A => [1, 3]
A(2:2:end)        # even elements of A => [2, 4]
A(end:-1:1)       # reversal of A => [4, 3, 2, 1]

다음: 함수 호출, 상위 문서: 표현식   [차례][찾아보기]