아마 IDL 사용자라면 이미 많이들 알고계시겠지만, INDGEN 함수는 0으로 시작하여 1씩 증가하는 정수형 값들로 구성된 배열을 생성하는 역할을 하는 함수입니다. 예를 들어서 다음과 같이 INDGEN(10)이면 0부터 9까지 1씩 증가하는 정수형 값들로 구성된 배열이 생성됩니다.
IDL> a = INDGEN(10)
IDL> HELP, a
A INT = Array[10]
IDL> PRINT, a
0 1 2 3 4 5 6 7 8 9
그런데 이 INDGEN 함수를 사용할 때 유의해야할 사항이 있습니다. 상당히 많은 갯수의 정수형 연속값들로 구성된 배열을 생성해야하는 경우입니다. 예를 들어서 5만개의 연속 정수값들로 구성된 배열을 생성하는 경우를 봅시다.
IDL> a = INDGEN(50000)
IDL> HELP, a
A INT = Array[50000]
이렇게 생성된 배열 a에 대하여 맨 처음 10개의 값들을 출력해보면 다음과 같습니다.
IDL> PRINT, a[0:9]
0 1 2 3 4 5 6 7 8 9
그리고 맨 마지막 10개의 값들을 출력해보면 다음과 같습니다.
IDL> PRINT, a[49990:49999]
-15546 -15545 -15544 -15543 -15542 -15541 -15540 -15539 -15538 -15537
뭔가 이상하죠? 우리가 기대했던 맨 마지막 10개의 값들은 아마 다음과 같을 것입니다.
49990 49991 49992 49993 49994 49995 49996 49997 49998 49999
그런데 이렇게 이상한 값들이 포함된 것은 다 이유가 있습니다. INDGEN 함수는 정수형 배열을 생성하는 기능을 하는데, 정수형 값은 -32768~+32767의 범위로 한정되기 때문입니다. 확인을 위해서 배열 a의 값들을 모두 출력하기엔 갯수가 너무 많으므로 다음과 같이 플롯으로 표출해봅시다.
a = INDGEN(50000)
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(a, COLOR='crimson', THICK=2, FONT_SIZE=11, /CURRENT)
표출된 모습은 다음 그림과 같습니다.
실제로는 0~32767까지는 제대로 생성이 되지만, 32768 이상이 되어야 할 값들은 -32768로 간주되어 여기서부터 1씩 증가하는 값들로 채워지게 됩니다. 그 사실을 이 그림을 통해서 확인할 수 있습니다. 해결책은 간단합니다. 그냥 정수형 대신 긴 정수형(Long Integer)으로 대체하는 것입니다. 즉 위의 예제코드에서 a를 생성하는 내용을 다음과 같이 수정하면 됩니다.
a = INDGEN(50000, /LONG)
이와 같이 INDGEN 함수와 /LONG 키워드를 함께 사용해도 되고 아니면 다음과 같이 아예 LINDGEN 함수를 사용해도 됩니다.
a = LINDGEN(50000)
이렇게 하면 a는 그냥 정수형이 아닌 긴 정수형 배열이 되고 0~49999의 범위를 갖는 50000개의 값들로 정상적으로 채워지게 됩니다. 이렇게 생성된 a의 값들을 플롯으로 표출해본 모습은 다음과 같습니다.
사실 이러한 현상이 나타나는 원인은 IDL에서 지원되는 자료형들마다 가용한 바이트(Byte) 수가 서로 다르기 때문입니다. 물론 이러한 특성은 프로그래밍 언어마다 다 있으며 그 방식도 언어마다 다 다릅니다. IDL의 경우(버전 8.8 기준)는 정수 계열의 자료형이 기본적으로 3종이 있는데(Unsigned까지 고려하면 6종이긴 합니다) 다음과 같습니다.
* 정수형(Integer) : 2byte(16bit)이며 범위는 -32768 ~ +32767
* 긴 정수형(Long Integer) : 4byte(32bit)이며 범위는 –2147483648 ~ +2147483647
* 64비트 긴 정수형(64-bit Long Integer) : 8byte(64bit)이며 범위는 –9223372036854775808 ~ +9223372036854775807
그렇기 때문에 연속되는 정수값들로 구성된 배열을 생성하고자 할 때 그 갯수 및 최대치가 어느 정도인가에 따라서 적절한 자료형의 배열을 생성해줘야한다는 점을 유의할 필요가 있습니다. 더군다나 자료형을 잘못 선택한다고 해서 특별히 에러가 발생하지는 않기 때문에, 잘못된 결과가 나온 후에도 그냥 모르고 지나칠 가능성도 분명히 있습니다. 따라서 세심한 주의가 필요하다는 점을 항상 염두에 두시기 바랍니다.
'IDL > 배열 생성 및 처리' 카테고리의 다른 글
배열 합치기(Array Concatenation) [2] (0) | 2023.04.18 |
---|---|
배열 합치기(Array Concatenation) [1] (0) | 2023.04.11 |
배열 처리 함수 소개 (SHIFT, REVERSE, ROTATE) [2] (0) | 2022.04.06 |
배열 처리 함수 소개 (SHIFT, REVERSE, ROTATE) [1] (0) | 2022.03.25 |
배열의 자료형과 값의 대입에 관한 유의사항 (0) | 2020.09.14 |