IDL에서 변수 또는 배열을 일종의 클래스(Class) 기반의 문법으로 처리하는 방법에 관하여 소개하고 있습니다. 지난 회에 이어서 오늘은 IDL_Variable 클래스에 관하여 알아보겠습니다. 이 클래스에 대하여 지원되는 여러가지 메서드(Method)들 중에서 주목해볼만한 몇가지만 골라서 예제와 함께 살펴보고자 합니다.
* 참고로 오늘 소개될 내용은 IDL 도움말에서 Routines (by Topic) -> Variable Functions and Attributes 섹션의 내용을 바탕으로 합니다. 그리고 이 내용은 해당 웹페이지를 통해서도 볼 수 있습니다.
< COMPARE 메서드 >
이 메서드는 대상 데이터를 기준값과 비교하는 역할을 하는데, 정확히 말하면 크다(GT), 똑같다(EQ), 작다(LT) 여부를 판별하여 그 결과를 돌려주는 역할입니다. 예를 들면 다음과 같습니다.
IDL> a = [24, 11, 15, 17]
IDL> r = a.COMPARE(15)
IDL> PRINT, r
1 -1 0 1
이와 같이 배열 a의 정수값들에 대하여 15와 비교를 하여 크면 1, 같으면 0, 작으면 -1을 돌려주는 방식입니다. 물론 대상 데이터는 배열 및 단일값 모두 가능합니다.
IDL> a = 20
IDL> r = a.COMPARE(15)
IDL> PRINT, r
1
< CONVERT 메서드 >
이 메서드는 대상 데이터의 자료형을 변환하는 역할을 합니다. 예를 들면 다음과 같습니다.
IDL> a = [8, 17, 11]
IDL> r = a.CONVERT(/FLOAT)
IDL> PRINT, r
8.00000 17.0000 11.0000
이것은 정수형 값들로 구성된 배열에 대하여 CONVERT 메서드를 사용하여 실수형 값들로 변환한 예제입니다. 여기서는 실수형으로의 변환을 위하여 /FLOAT 키워드가 함께 사용되었는데, 이와 같이 변환의 목표가 되는 자료형을 키워드로 명시하면 됩니다. 그리고 이 때 다음과 같이 TYPE 키워드에 자료형별 고유 번호를 부여하는 방식으로 처리해도 됩니다.
IDL> r = a.CONVERT(TYPE=4)
IDL> PRINT, r
8.00000 17.0000 11.0000
실수형에 대한 고유 번호는 4이고 그 외 다른 자료형들에 대한 고유 번호는 IDL 도움말을 참조하면 됩니다. 실수형 값들을 정수형으로 변환하는 경우도 보면 다음과 같습니다.
IDL> a = [8.3, 12.7, 6.8]
IDL> r = a.CONVERT(/INT)
IDL> PRINT, r
8 12 6
이와 같이 정수형으로의 변환을 위하여 /INT 키워드가 사용되었는데 TYPE=2 키워드를 사용해도 됩니다. 다만 이 결과를 잘 보면 반올림은 전혀 고려되지 않았는데, 만약 실수를 정수로 변환하면서 반올림까지 고려하려면 CONVERT 대신 다른 메서드를 사용해야 합니다.
< TOINTEGER 메서드 >
이 메서드는 대상 데이터를 정수형으로 변환하는 역할을 합니다. 다만 /ROUND, /CEIL, /FLOOR 등의 키워드를 함께 사용하여 정수로 변환하는데 있어서 세부적인 방식을 지정할 수 있습니다. 즉 바로 위의 예제에서 배열 a의 실수값들을 정수형으로 변환할 때 반올림까지도 고려하려면, 다음과 같이 TOINTEGER 메서드를 /ROUND 키워드와 함께 사용하면 됩니다.
IDL> a = [8.3, 12.7, 6.8]
IDL> r = a.TOINTEGER(/ROUND)
IDL> PRINT, r
8 13 7
그리고 /CEIL, /FLOOR 키워드를 사용하면 각각에 해당되는 결과를 얻을 수 있습니다. 즉 /CEIL 키워드를 사용하면 무조건 올림 처리를 하고 /FLOOR 키워드를 사용하면 무조건 내림 처리를 합니다.
IDL> r = a.TOINTEGER(/CEIL)
IDL> PRINT, r
9 13 7
IDL> r = a.TOINTEGER(/FLOOR)
IDL> PRINT, r
8 12 6
< EQUALS 메서드 >
이 메서드는 대상 데이터를 특정한 값과 비교해서 동일한가 여부를 체크하는 역할을 합니다. 다만 대상 데이터 및 기준값이 각각 단일값 또는 배열이냐 여부에 따라 결과를 산출하는 방식에 있어서 차이가 있습니다. 일단 간단한 예제부터 먼저 보면 다음과 같습니다.
IDL> a = 26
IDL> r = a.EQUALS(26)
IDL> PRINT, r
1
IDL> a = 27
IDL> r = a.EQUALS(26)
IDL> PRINT, r
0
이와 같이 대상 데이터는 a라는 단일값 변수인데 이 값이 26과 동일한가 여부를 체크하여 같으면 1 다르면 0이라는 결과값을 산출합니다. 그런데 EQUALS 메서드에는 TOLERANCE라는 키워드가 있습니다. 즉 허용 한계 오차를 따로 설정하는 역할을 하는 키워드입니다. 만약 이 키워드를 사용하면서 다음과 같이 시도해본다면 결과는 달라집니다.
IDL> r = a.EQUALS(26, TOLERANCE=1)
IDL> PRINT, r
1
즉 여기서는 a의 값인 27과 기준값인 26을 동일하다고 판정하였는데, 그 이유는 허용 한계 오차가 1로 설정되었기 때문입니다. 즉 기준값인 26을 중심으로 26-1부터 26+1까지는 동일한 것으로 간주하라는 의미입니다. 이번에는 대상 데이터가 배열인 예제를 봅시다.
IDL> a = [14.6, 12.9, 13.8, 13.2, 14.3]
IDL> r = a.EQUALS(13.5)
IDL> PRINT, r
0
이와 같이 대상 데이터가 배열이고 기준값은 단일값인 경우에는 대상 배열 내 모든 값들이 기준값과 같아야만 동일한 것으로 간주합니다. 그렇기 때문에 위의 결과는 0입니다. 그런데 여기서도 TOLERANCE 키워드로 허용 오차를 주면 결과는 달라질 수 있습니다.
IDL> r = a.EQUALS(13.5, TOLERANCE=1.5)
IDL> PRINT, r
1
이렇게 하면 배열 a의 모든 값들은 13.5-1.5~13.5+1.5의 범위 내에는 다 포함되기 때문에 기준값인 13.5와 동일한 것으로 간주된 것입니다.그리고 대상 데이터 및 기준값이 둘 다 배열인 경우도 있습니다. 이러한 경우에는 일단 두 배열의 크기 및 구조는 동일해야 합니다. 예제를 보면 다음과 같습니다.
IDL> a = [72, 59, 86]
IDL> b = [70, 60, 88]
IDL> r = a.EQUALS(b)
IDL> PRINT, r
0
이와 같이 배열 vs. 배열인 경우에는 두 배열의 모든 원소값들이 서로 같아야 동일한 것으로 간주합니다. 하지만 여기서도 TOLERANCE 키워드를 사용하여 허용 오차를 따로 설정하면 결과가 달라질 수 있습니다.
IDL> r = a.EQUALS(b, TOLERANCE=2)
IDL> PRINT, r
1
< DIFF 메서드 >
이 메서드는 두 데이터를 서로 비교하여 그 차이점을 찾아주는 역할을 합니다. 이 때 두 데이터 모두 배열이어야 하며, 서로간의 비교를 통하여 새롭게 추가된 멤버와 제외된 멤버를 각각 알아낼 수 있습니다. 예제를 보면 다음과 같습니다.
IDL> a = ['dd', 'yy', 'cc']
IDL> b = ['gg', 'cc', 'xx', 'dd', 'pp']
이와 같이 배열 a와 b가 정의되어 있을 때 a를 b와 비교하여 그 변화를 추적해보기 위하여 다음과 같이 DIFF 메서드를 적용해봅시다.
IDL> r = a.DIFF(b, ADDED=add, REMOVED=rem)
여기서는 배열 a를 배열 b와 비교하면서, a에는 없었지만 b로 가면서 새로 추가된 원소들의 목록을 ADD 키워드에 지정된 add라는 배열로 받아오고, a에는 있었지만 b로 가면서 제외된 원소들의 목록을 REMOVED 키워드에 지정된 rem이라는 배열로 받아오도록 한 것입니다. 먼저 add의 값들을 출력해보면 다음과 같습니다.
IDL> PRINT, add
gg xx pp
이와 같이 원래 a에는 없었지만 b에서 새로 추가된 구성 원소들을 확인할 수 있습니다. 그리고 rem의 값들을 출력해보면 다음과 같습니다.
IDL> PRINT, rem
yy
이와 같이 원래 a에는 있었지만 b에서는 제외된 원소들을 확인할 수 있습니다. 따라서 배열 데이터의 변화를 추적할 때 유용하게 사용할 수 있는 방법이 될 것 같습니다.
지금까지 IDL_Variable 클래스에서 지원되는 여러 메서드들 중에서 COMPARE, CONVERT, , TOINTEGER, EQUALS, DIFF 등을 살펴보았습니다. 물론 이외에도 여러가지 다양한 메서드들이 지원되는데, 그 종류 및 각각의 사용법에 관한 자세한 내용은 서두에서 언급했듯이 IDL 도움말에서 IDL_Variable 클래스에 관한 섹션 또는 관련 웹페이지를 통하여 확인할 수 있습니다.
그러면 또 다른 클래스 및 관련 메서드들에 관해서는 이어질 후속 게시물에서 소개하기로 하겠습니다.
'IDL > Data Type & Format' 카테고리의 다른 글
JSON 파일의 읽기 및 처리 (List within List) (0) | 2024.02.27 |
---|---|
클래스 기반 문법에 의한 변수 및 배열 처리 [3] (5) | 2024.01.03 |
클래스 기반 문법에 의한 변수 및 배열 처리 [1] (0) | 2023.12.19 |
ASDF 형식 파일의 생성 및 읽기 (0) | 2023.11.02 |
SER 포맷의 파일 읽기 (0) | 2023.03.20 |