IDL/Math

VALUE_LOCATE 함수 소개

이상우_idl 2024. 6. 7. 17:55
728x90
반응형

오늘은 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 함수가 이러한 한계점을 갖고 있다는 점은 감안해야 합니다.

 

그러면 이와 같이 배열 내 원소값들이 증가와 감소가 혼재된 경우에는 어떻게 탐색을 하는 것이 좋을까요? 단번에 해결해주는 내장함수가 없더라도 뭔가 별도의 코딩에 의한 방법은 있을 것 같습니다. 이러한 문제와 관련해서는 나중에 따로 다뤄보기로 하겠습니다.

반응형