Main Content

조건을 충족하는 배열 요소 찾기

이 예제에서는 조건을 배열에 적용하여 배열의 요소를 필터링하는 방법을 보여줍니다. 예를 들어, 행렬에서 짝수 요소를 검토하거나, 다차원 배열에서 모든 0의 위치를 찾거나, 데이터에서 NaN 값을 바꿀 수 있습니다. 이러한 작업은 관계 연산자와 논리 연산자 조합을 사용하여 수행할 수 있습니다. 관계 연산자(>, <, >=, <=, ==, ~=)는 배열에 조건을 적용합니다. 관계 연산자를 논리 연산자 and, or, not(각각 &, |, ~로 나타냄)으로 연결하면 여러 개의 조건을 적용할 수 있습니다.

하나의 조건 적용하기

하나의 조건을 적용해 보기 위해 먼저 1과 15 사이의 임의의 정수를 포함하는 5×5 행렬을 생성합니다. 재현이 가능하도록 난수 생성기를 디폴트 상태로 재설정합니다.

rng default
A = randi(15,5)
A = 5×5

    13     2     3     3    10
    14     5    15     7     1
     2     9    15    14    13
    14    15     8    12    15
    10    15    13    15    11

보다 작음 관계 연산자 <를 사용하여 A에서 9보다 작은 요소를 확인합니다. 결과를 B에 저장합니다.

B = A < 9
B = 5x5 logical array

   0   1   1   1   0
   0   1   0   1   1
   1   0   0   0   0
   0   0   1   0   0
   0   0   0   0   0

결과는 논리형 행렬입니다. B에 포함된 값은 각각 논리값 1(true) 또는 논리값 0(false) 상태를 나타내어 A에서 대응하는 요소가 조건 A < 9를 충족하는지 여부를 보여줍니다. 예를 들어, A(1,1)13이므로 B(1,1)은 논리값 0(false)입니다. 그러나, A(1,2)2이므로 B(1,2)는 논리값 1(true)입니다.

A의 요소 중 9보다 작은 요소의 위치 정보는 B에 포함되지만, 여기에서 그 요소의 을 알 수는 없습니다. 두 개의 행렬을 요소별로 비교하는 대신, B를 사용하여 A의 요소를 참조할 수 있습니다.

A(B)
ans = 8×1

     2
     2
     5
     3
     8
     3
     7
     1

그 결과로 A에서 9보다 작은 요소로 구성된 열 벡터가 반환됩니다. B는 논리형 행렬이므로 이 작업을 논리형 인덱싱이라고 합니다. 이 경우는 인덱스로 사용되고 있는 논리형 배열이 다른 배열과 크기가 같지만 이는 필수적인 것은 아닙니다. 자세한 내용은 배열 인덱싱 항목을 참조하십시오.

일부 문제는 조건을 충족하는 배열 요소의 실제 값보다 위치에 대한 정보를 필요로 합니다. 이 예제에서는 find 함수를 사용하여 A에서 9보다 작은 요소 모두에 대한 위치를 찾을 수 있습니다.

I = find(A < 9)
I = 8×1

     3
     6
     7
    11
    14
    16
    17
    22

결과는 선형 인덱스로 구성된 열 벡터입니다. 개별 인덱스가 A에서 9보다 작은 요소의 위치를 나타내고 있으므로, 사실상 A(I)A(B)와 동일한 결과를 반환합니다. 다른 점은 A(B)가 논리형 인덱싱을 사용하는 반면, A(I)는 선형 인덱싱을 사용한다는 것입니다.

여러 조건 적용하기

논리 연산자 and, ornot을 사용하여 여러 조건을 하나의 배열에 적용할 수 있습니다. 이때 조건의 개수는 한두 개로 제한되지 않습니다.

먼저, 논리 연산자 and(&로 나타냄)를 사용하여 요소가 9보다 작고 2보다 커야 함을 나타내는 두 가지 조건을 지정합니다. 이 조건을 논리형 인덱스로 참조하여 두 가지 조건을 모두 충족하는 요소를 확인합니다.

A(A<9 & A>2)
ans = 5×1

     5
     3
     8
     3
     7

그 결과로 A에서 두 가지 조건을 모두 충족하는 요소를 포함하는 목록이 반환됩니다. 각각의 조건을 개별 명령문으로 지정하고, 논리 연산자로 연결해야 합니다. 예를 들어, 위에서 설명한 조건을 A(2<A<9)로 지정할 수는 없습니다. 그렇게 하면 A(2<A | A<9)로 실행되기 때문입니다.

다음으로, A에서 9보다 작고 짝수인 요소를 찾습니다.

A(A<9 & ~mod(A,2))
ans = 3×1

     2
     2
     8

그 결과로 A에서 9보다 작은 모든 짝수 요소를 포함하는 목록이 반환됩니다. 논리 NOT 연산자(~)를 사용하면 행렬 mod(A,2)는 그 요소가 2로 나누어지는 위치에 논리값 1(true)을 갖는 논리형 행렬로 변환됩니다.

마지막으로, A에서 9보다 작고 짝수이며 2가 아닌 요소를 찾습니다.

A(A<9 & ~mod(A,2) & A~=2)
ans = 8

그 결과로 짝수이고 9보다 작으며 2가 아닌, 8이 반환됩니다. 8은 A에서 이 세 가지 조건을 모두 충족하는 유일한 요소입니다.

find 함수를 사용하여 조건을 충족하는 값인 8을 가지는 요소의 인덱스를 구합니다.

find(A<9 & ~mod(A,2) & A~=2)
ans = 14

결과는 A(14) = 8을 나타냅니다.

조건을 충족하는 값 바꾸기

여러 기존 배열 요소의 값을 동시에 변경하는 것이 유용한 경우가 있습니다. 단순한 대입문에 논리형 인덱싱을 사용하여 배열에서 조건을 충족하는 값을 바꿀 수 있습니다.

A에서 10보다 큰 값을 모두 숫자 10으로 바꿉니다.

A(A>10) = 10
A = 5×5

    10     2     3     3    10
    10     5    10     7     1
     2     9    10    10    10
    10    10     8    10    10
    10    10    10    10    10

다음으로, A에서 10과 일치하지 않는 값을 모두 NaN 값으로 바꿉니다.

A(A~=10) = NaN
A = 5×5

    10   NaN   NaN   NaN    10
    10   NaN    10   NaN   NaN
   NaN   NaN    10    10    10
    10    10   NaN    10    10
    10    10    10    10    10

마지막으로, A에서 NaN 값을 모두 0으로 바꾸고 논리 NOT 연산자 ~A를 적용합니다.

A(isnan(A)) = 0;
C = ~A
C = 5x5 logical array

   0   1   1   1   0
   0   1   0   1   1
   1   1   0   0   0
   0   0   1   0   0
   0   0   0   0   0

결과로 반환되는 행렬은 NaN 값 대신 논리값 1(true)을 갖고 10 대신 논리값 0(false)을 가집니다. 논리 NOT 연산 ~A는 숫자형 배열을 논리형 배열로 변환하여, A&C는 논리값 0(false)으로 구성된 행렬을 반환하고 A|C는 논리값 1(true)로 구성된 행렬을 반환하도록 합니다.

참고 항목

| | | | | | | |