오늘은 배열과 배열을 비교하는 방법에 관하여 알아보고자 합니다. 두개의 배열이 서로 동일한가 아닌가를 판단하는데 있어서 가장 간단하게 사용할 수 있는 방법은 ARRAY_EQUAL 함수를 사용하는 것입니다. 다음과 같이 배열 a와 b가 정의되어 있다고 합시다. 물론 두 배열은 보시다시피 서로 완벽하게 동일합니다.
IDL> a = [3, 4, 6, 8]
IDL> b = [3, 4, 6, 8]
이 때 다음과 같이 ARRAY_EQUAL 함수를 사용하여 두 배열을 비교하면 1이란 값이 출력됩니다. 즉 두 배열이 서로 동일하다는 의미입니다.
IDL> PRINT, ARRAY_EQUAL(a, b)
1
만약 다음과 같이 두 배열이 서로 동일하지 않을 경우에는 ARRAY_EQUAL에 의하여 0이란 값이 출력됩니다. 즉 두 배열이 서로 동일하지 않다는 의미입니다.
IDL> a = [3, 4, 6, 8]
IDL> b = [3, 4, 6, 9]
IDL> PRINT, ARRAY_EQUAL(a, b)
0
그런데 만약 다음과 같이 두 배열이 크기는 다르지만 앞부분만 서로 동일한 경우도 있습니다.
IDL> a = [3, 4, 6, 8]
IDL> b = [3, 4, 6, 8, 9, 12, 14]
이럴 경우에는 ARRAY_EQUAL은 다음과 같이 두 배열이 서로 다르다고 판정합니다.
IDL> PRINT, ARRAY_EQUAL(a, b)
0
그런데 다음과 같이 DIFFERENT_LENGTHS라는 키워드를 함께 사용하면 두 배열이 서로 동일하다고 판정하게 됩니다.
IDL> PRINT, ARRAY_EQUAL(a, b, /DIFFERENT_LENGTHS)
1
여기서 사용된 DIFFERENT_LENGTHS 키워드의 역할은 비교 대상이 되는 두 배열이 크기가 다를 경우 작은 크기의 배열의 인덱스들만을 대상으로 판단하게 하는 것입니다. 따라서 크기가 더 작은 배열인 a에서 존재하는 인덱스들(0, 1, 2, 3)만을 비교의 대상으로 간주하게 됩니다(참고로 이 키워드는 IDL 8.7.1 버전에서 새로 추가된 키워드입니다).
그런데 ARRAY_EQUAL 함수에는 배열 뿐 아니라 단일값(Scalar)도 인수로 사용하는 것이 가능합니다. 즉 다음과 같이 배열과 단일값을 서로 비교하는 것도 가능합니다.
IDL> a = [5, 5, 5, 5]
IDL> PRINT, ARRAY_EQUAL(a, 5)
1
IDL> PRINT, ARRAY_EQUAL(a, 6)
0
즉 이와 같이 어떤 배열의 구성원소들이 모두 동일한 값들로 구성되어 있을 때 의미있는 방법이라고 볼 수 있습니다. 따라서 배열 내에 하나라도 다른 값이 있을 경우에는 위와 같은 방법은 큰 의미는 없게 됩니다.
IDL> a = [5, 5, 6, 5]
IDL> PRINT, ARRAY_EQUAL(a, 5)
0
IDL> PRINT, ARRAY_EQUAL(a, 6)
0
그리고 함수의 이름이 좀 무색해지는 감도 있지만, 다음과 같이 단일값과 단일값 사이의 비교도 가능합니다.
IDL> PRINT, ARRAY_EQUAL(5, 5)
1
IDL> PRINT, ARRAY_EQUAL(5, 6)
0
물론 이런 경우에는 다음과 같이 그냥 논리연산자 EQ를 사용하는 것이 더 간단할 것으로 생각됩니다.
IDL> PRINT, 5 EQ 5
1
IDL> PRINT, 5 EQ 6
0
여기서 한 걸음만 더 들어가본다면, 배열과 배열 사이의 비교에서도 그냥 ARRAY_EQUAL 함수를 사용하는 대신에 그냥 EQ 연산자를 사용할 수도 있습니다. 즉 앞서 이미 봤던 다음과 같은 예제에서는 ARRAY_EQUAL 함수를 사용하면 그냥 두 배열이 서로 다르다는 결과만 얻게 됩니다.
IDL> a = [5, 5, 5, 5]
IDL> b = [5, 5, 6, 5]
IDL> PRINT, ARRAY_EQUAL(a, b)
0
그런데 만약 EQ 연산자를 사용하면 다음과 같은 결과를 얻게 됩니다.
IDL> a = [5, 5, 5, 5]
IDL> b = [5, 5, 6, 5]
IDL> PRINT, a EQ b
1 1 0 1
즉 이 결과는 두 배열을 서로 비교하여 값이 일치하지 않는 인덱스가 어디인지도 알려주는 역할을 합니다. 따라서 이러한 결과에 대하여 다음과 같이 WHERE 함수를 추가로 적용하면, 두 배열 사이의 구성원소 값이 서로 일치하지 않는 위치 인덱스까지도 산출할 수 있습니다.
IDL> result = a EQ b
IDL> ww = WHERE(result EQ 0)
IDL> PRINT, ww
2
그래서 정리해보면, 두 배열이 동일한가 여부 자체에만 관심이 있다면 ARRAY_EQUAL을 사용하는 것만으로 충분하지만, 두 배열 사이의 차이가 정확히 어디에서 발생하는가에 대해서까지 알아내야 할 경우라면 EQ 연산자와 WHERE 함수를 이용하면 됩니다.
'IDL > 배열 생성 및 처리' 카테고리의 다른 글
IDL에서 배열의 생성에 관한 각종 팁들 정리 (0) | 2020.07.16 |
---|---|
SORT 함수의 이용 방법 (0) | 2020.04.20 |
UNIQ 함수에 관하여 (0) | 2018.07.23 |
배열 생성 관련 특수 예제 (0) | 2018.02.02 |
배열 인덱싱 관련 예제 (0) | 2018.01.30 |