Main Content

인덱싱

첨자

A의 행 i와 열 j의 요소는 A(i,j)로 나타냅니다. 예를 들어, A(4,2)는 네 번째 행과 두 번째 열의 숫자입니다. 마방진의 경우 A(4,2)15입니다. 따라서 A의 네 번째 열에 있는 요소의 합을 계산하려면 다음을 입력합니다.

A(1,4) + A(2,4) + A(3,4) + A(4,4)

이 첨자는 다음과 같은 결과를 생성합니다.

ans =
     34

하지만 이것이 단일 열의 합을 가장 효율적으로 구하는 방식은 아닙니다.

단일 첨자 A(k)를 사용하여 행렬의 요소를 나타낼 수도 있습니다. 단일 첨자는 행 벡터와 열 벡터를 나타내는 일반적인 방식입니다. 단일 첨자는 2차원 행렬에도 적용될 수 있는데, 이 경우 배열은 원본 행렬의 열에서 구성된 하나의 긴 열 벡터로 간주됩니다. 따라서 마방진의 경우 A(8)을 사용해도 A(4,2)에 저장된 값 15를 나타낼 수 있습니다.

행렬의 범위를 벗어난 요소 값을 사용하려고 하면 오류가 발생합니다.

t = A(4,5)
Index exceeds matrix dimensions.

이와 반대로 행렬의 범위를 벗어난 요소의 값을 저장하면 새로운 요소를 받아들이도록 크기가 늘어납니다.

X = A;
X(4,5) = 17

X =
    16     3     2    13     0
     5    10    11     8     0
     9     6     7    12     0
     4    15    14     1    17

콜론 연산자

콜론(:)은 가장 중요한 MATLAB® 연산자 중 하나로, 다음과 같은 여러 가지 형태로 사용됩니다. 다음 표현식은

1:10

1에서 10까지의 정수가 포함된 행 벡터입니다.

1     2     3     4     5     6     7     8     9    10

비단위 간격(간격: 1 아님) 결과를 구하려면 증분을 지정하십시오. 예를 들면 다음과 같습니다.

100:-7:50

이는 아래와 같습니다.

100    93    86    79    72    65    58    51

또한

0:pi/4:pi

이는 아래와 같습니다.

0    0.7854    1.5708    2.3562    3.1416

콜론을 수반하는 첨자 표현식은 행렬의 일부를 나타냅니다.

A(1:k,j)

이는 Aj번째 열에 있는 k 요소를 나타냅니다. 따라서 다음은

sum(A(1:4,4))

네 번째 열의 합을 계산합니다. 하지만 이 계산을 보다 효과적으로 수행하는 방법이 있습니다. 콜론 자체는 행렬의 행이나 열에 있는 모든 요소를 나타내며 키워드 end마지막 행이나 열을 나타냅니다. 따라서 다음은

sum(A(:,end))

A의 마지막 열에 있는 요소의 합을 계산합니다.

ans =
     34

그러면 어째서 4×4 마방진의 합이 34가 되는 것일까요? 1에서 16까지의 정수가 각각 합이 동일한 네 개의 그룹으로 정렬되는 경우 이러한 합은 다음과 같아야 합니다.

sum(1:16)/4

그리고 이는 당연히 다음과 같은 결과로 이어집니다.

ans =
     34

결합

결합(Concatenate)은 작은 행렬을 결합하여 더 큰 행렬을 만드는 과정입니다. 실제로 위에서 첫 번째 행렬을 만들 때 행렬의 개별 요소들을 결합(Concatenate)했습니다. 대괄호 쌍([])은 결합(Concatenate) 연산자입니다. 예를 들어, 4×4 마방진 A로 시작하여 다음과 같이 만들어 보겠습니다.

B = [A  A+32; A+48  A+16]

이 결과 8×8 행렬이 만들어지며, 이는 네 개의 부분행렬을 결합하여 얻은 결과입니다.

B =

    16     3     2    13    48    35    34    45
     5    10    11     8    37    42    43    40
     9     6     7    12    41    38    39    44
     4    15    14     1    36    47    46    33
    64    51    50    61    32    19    18    29
    53    58    59    56    21    26    27    24
    57    54    55    60    25    22    23    28
    52    63    62    49    20    31    30    17

이 행렬은 또 다른 마방진이 되기 위한 중간 형태에 해당합니다. 이 행렬의 요소는 정수 1:64를 다시 배열한 것이며, 행렬의 열 합은 8×8 마방진에 해당하는 올바른 값을 나타냅니다.

sum(B)

ans =
   260   260   260   260   260   260   260   260

하지만 이 행렬의 행 합인 sum(B')'는 모두가 같지는 않습니다. 이를 유효한 8×8 마방진으로 만들려면 추가로 조작해야 합니다.

행 삭제와 열 삭제

대괄호 한 쌍만 사용하여 행렬에서 행과 열을 삭제할 수 있습니다. 먼저, 다음과 같이 시작합니다.

X = A;

그런 다음 X의 두 번째 열을 삭제하려면 다음 식을 사용합니다.

X(:,2) = []

그러면 X가 다음과 같이 변경됩니다.

X =
    16     2    13
     5    11     8 
     9     7    12
     4    14     1

행렬의 단일 요소를 삭제하면 더 이상 행렬이 아닌 결과를 얻게 됩니다. 따라서 다음과 같은 표현식을 사용하면

X(1,2) = []

오류가 발생합니다. 하지만 단일 첨자를 사용하면 단일 요소 또는 일련의 요소가 삭제되고 나머지 요소는 행 벡터로 형태 변경(reshape)됩니다. 따라서 다음을 실행하면

X(2:2:10) = []

다음과 같은 결과를 얻게 됩니다.

X =
    16     9     2     7    13    12     1

스칼라 확장

행렬과 스칼라는 여러 가지 방법으로 결합할 수 있습니다. 예를 들어, 스칼라를 각 요소에서 빼는 방식으로 행렬에서 스칼라를 뺍니다. 여기서 살펴본 마방진에 있는 요소의 평균값은 8.5이므로 다음을 사용하면

B = A - 8.5

다음과 같이 열의 합이 0인 행렬이 만들어집니다.

B =
      7.5     -5.5     -6.5      4.5
     -3.5      1.5      2.5     -0.5
      0.5     -2.5     -1.5      3.5
     -4.5      6.5      5.5     -7.5

sum(B)

ans =
     0     0     0     0

MATLAB에서는 스칼라 확장으로 지정된 스칼라를 범위 내의 모든 인덱스에 대입합니다. 예를 들면 다음과 같습니다.

B(1:2,2:3) = 0

이는 다음과 같이 B의 일부를 소거합니다.

B =
      7.5        0        0      4.5
     -3.5        0        0     -0.5
      0.5     -2.5     -1.5      3.5
     -4.5      6.5      5.5     -7.5

논리 첨자

논리 연산과 관계 연산으로 생성된 논리 벡터는 부분배열을 참조하는 데 사용할 수 있습니다. X는 일반 행렬이고 L은 특정한 논리 연산으로 얻은 동일한 크기의 행렬이라고 가정해 보겠습니다. 그러면 X(L)X의 요소 중 L의 요소가 0이 아닌 요소를 지정합니다.

이러한 유형의 첨자는 논리 연산을 첨자 표현식으로 지정하여 한 번에 수행할 수 있습니다. 다음과 같은 데이터 세트가 있다고 가정해 보겠습니다.

x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];

NaN은 질문서의 항목에 응답하지 않은 부분 같이 누락된 관측값을 나타내는 마커입니다. 논리형 인덱싱으로 누락된 데이터를 제거하려면 isfinite(x)를 사용하십시오. 이는 모든 유한한 숫자형 값에 대해서는 true이고 NaNInf에 대해서는 false입니다.

x = x(isfinite(x))
x =
  2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

이제 5.1이라는 관측값 하나가 다른 관측값과 매우 다르게 보이는데, 이를 이상값이라고 합니다. 다음 명령문을 실행하면 이상값이 제거되는데, 이 경우에는 평균에서 3 표준편차를 초과하는 요소가 해당됩니다.

x = x(abs(x-mean(x)) <= 3*std(x))
x =
  2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8

또 다른 예로, 논리형 인덱싱과 스칼라 확장을 사용하여 소수가 아닌 수를 0으로 설정하는 방식으로 뒤러(Durer)의 마방진에서 소수의 위치를 강조 표시해 보겠습니다. magic 함수 항목을 참조하십시오.

A(~isprime(A)) = 0

A =
     0     3     2    13
     5     0    11     0
     0     0     7     0
     0     0     0     0

find 함수

find 함수는 주어진 논리 조건을 충족하는 배열 요소로 구성된 인덱스를 확인합니다. 가장 단순한 형태인 find는 인덱스로 구성된 열 벡터를 반환합니다. 인덱스로 구성된 행 벡터를 얻으려면 이 벡터를 전치하십시오. 예를 들어, 다시 뒤러의 마방진으로 시작해 보겠습니다. magic 함수 항목을 참조하십시오.

k = find(isprime(A))'

이렇게 하면 1차원 인덱싱으로 마방진에서 소수의 위치를 선택할 수 있습니다.

k =
     2     5     9    10    11    13

이 소수들을 k로 결정된 순서에 따라 다음을 통해 행 벡터로 표시해 보겠습니다.

A(k)

ans =
     5     3     2    11     7    13

대입문에서 k를 좌변 인덱스로 사용하면 행렬 구조체가 보존됩니다.

A(k) = NaN

A =
    16   NaN   NaN   NaN
   NaN    10   NaN     8
     9     6   NaN    12
     4    15    14     1