오늘은 VALUE_LOCATE 함수를 소개해보고자 합니다. 이 함수의 역할은 점진적으로 증가 또는 감소하는 원소값들로 구성된 1차원 배열에 대하여 특정한 값이 위치한 구간을 찾아내는 것입니다. 그러면 이 함수의 역할을 예제와 함께 구체적으로 살펴보겠습니다. 예제로 사용할 1차원 배열은 다음과 같이 정의해봅시다.
arr = [1:11]*10.+RANDOMU(-1, 11)*6-3
PRINT, arr
여기서 정의된 1차원 배열 arr은 다음과 같이 11개의 값들로 구성됩니다.
7.58579 17.6696 32.4743 40.3762 51.7342 60.1579 71.6800 81.6237 87.1076 98.7014 112.817
그리고 이 값들은 뒤로 갈수록 증가하는 형태인데, 도식적으로 나타내보면 다음 그림과 같습니다.
그러면 이러한 배열 arr에 대하여 68이라는 값이 어디에 위치하는가를 찾아봅시다. 이를 위해서는 VALUE_LOCATE 함수를 다음과 같이 사용하면 됩니다.
ind = VALUE_LOCATE(arr, 68)
PRINT, ind
이와 같이 대상 배열 및 탐색할 값을 인수로 주면 됩니다. 출력된 결과를 보면 다음과 같습니다.
5
이와 같이 5라는 값이 산출되었는데요. 이것은 배열 arr의 값들에 대하여 정의되는 구간들 중 6번째(인덱스로는 5) 구간에 68이라는 값이 위치한다는 의미입니다. 즉 VALUE_LOCATE 함수는 구간 인덱스를 결과로 전달합니다. 실제로 배열 arr의 값들에 대한 구간들은 다음과 같이 정의됩니다.
구간 1 : 7.58579 ~ 17.6696
구간 2 : 17.6696 ~ 32.4743
구간 3 : 32.4743 ~ 40.3762
구간 4 : 40.3762 ~ 51.7342
구간 5 : 51.7342 ~ 60.1579
구간 6 : 60.1579 ~ 71.6800
~~~~~~~~~
구간 10 : 98.7014 ~ 112.817
즉 배열 arr은 11개의 값들로 구성되므로 구간들은 총 10개가 되며, 이와 같이 정의된 구간들 중 68이라는 값은 6번째 구간에 속한다는 의미입니다. 이러한 원리를 도식적으로 나타내본다면 대략 다음 그림과 같을 것입니다.
따라서 VALUE_LOCATE 함수는 이러한 방식으로 작동된다고 보면 됩니다. 만약 배열 내 값들로부터 매우 동떨어진 값을 대상으로 할 경우에는 다음과 같이 결과를 산출합니다.
ind = VALUE_LOCATE(arr, 2)
PRINT, ind
-1
ind = VALUE_LOCATE(arr, 150)
PRINT, ind
10
이와 같이 극단적인 값을 대상으로 할 경우에는 구간들 중 맨 처음 또는 맨 마지막 구간으로 결과를 산출한다는 점을 유의해야 합니다. 그리고 다음과 같이 대상 값들을 배열로 묶어서 한꺼번에 결과를 얻는 것도 가능합니다.
ind = VALUE_LOCATE(arr, [57, 22, 89, 103])
PRINT, ind
4 1 8 9
다만 서두에서 언급했듯이 VALUE_LOCATE 함수는 그 대상 배열의 원소값들이 전체적으로 증가만 하거나 감소만 하는 경우에만 제 역할을 수행한다는 것을 유의해야 합니다. 만약 원소값들이 증가 및 감소를 모두 하는 경우에는 정상적인 결과를 산출하지 못합니다. 그러한 예를 도식적으로 나타내보면 다음과 같습니다.
이것은 증가했다가 감소하는 값들로 구성된 배열에 대하여 68이라는 값의 위치를 VALUE_LOCATE 함수로 탐색해본 결과인데요. 그냥 보면 결과값이 두 개가 나와야 정상일 것 같지만 VALUE_LOCATE 함수의 결과는 그러한 기대와는 분명히 거리가 있습니다. 따라서 VALUE_LOCATE 함수가 이러한 한계점을 갖고 있다는 점은 감안해야 합니다.
그러면 이와 같이 배열 내 원소값들이 증가와 감소가 혼재된 경우에는 어떻게 탐색을 하는 것이 좋을까요? 단번에 해결해주는 내장함수가 없더라도 뭔가 별도의 코딩에 의한 방법은 있을 것 같습니다. 이러한 문제와 관련해서는 나중에 따로 다뤄보기로 하겠습니다.
'IDL > Math' 카테고리의 다른 글
TS_FCAST 함수 소개 (0) | 2024.08.21 |
---|---|
플랑크(Planck) 복사량 법칙의 가시화 (1) | 2024.06.20 |
증가 및 감소 연산자 (Increment and Decrement Operator) (1) | 2023.11.20 |
K-평균 군집화 분석 (K-means Clustering) (0) | 2023.10.25 |
군집화(Clustering)와 덴드로그램(Dendrogram) (1) | 2023.10.19 |