IDL/Programming

REFORM과 CONGRID 함수의 원리 및 활용 [2]

이상우_idl 2015. 10. 29. 11:00
반응형

지난 회에서 바로 이어서 오늘은 REFORM 함수에 관하여 알아보겠습니다. CONGRID 함수가 차원은 유지한 상태에서 크기에 대한 변형이 자유로운 경우라고 보면, REFORM은 차원에 대한 변경 자체가 주 목적인 내장함수라는 차이가 있습니다. 즉, 원본이 1차원이었던 배열을 2차원, 3차원 등의 형태로 만드는 것이 가능하고 그 반대도 가능합니다. 그런데 여기에는 중요한 전제가 있습니다. 바로 "배열내 전체 원소 갯수는 변할 수 없다"는 것입니다.


예제를 보면서 설명해보기로 하겠습니다. 다음과 같이 1, 2, 3, 4 네 개의 원소값들을 갖는 a라는 배열이 있는데, 이 배열에 대하여 REFORM 함수를 적용하여 2X2의 형태를 갖는 2차원 배열로 변형하고 그 결과를 b라는 배열로 만들었습니다. 그리고 b의 구조를 확인하고 값들까지 출력해보면 다음과 같습니다.


IDL> a = [1, 2, 3, 4]

IDL> b = REFORM(a, 2, 2)

IDL> HELP, b

B               INT       = Array[2, 2]

IDL> PRINT, b

       1       2

       3       4


즉 4개 짜리 1차원 배열을 2X2의 형태를 갖는 2차원 배열로 변형하였습니다. 이 때 원본 배열의 값들이 새로운 배열에서 어떤 순서로 배치되었는가를 유의해야 합니다. 일단은 가로(row) 방향으로 채운 다음에 그 다음 줄로 이동하여(column 방향 이동) 값들을 채우는 방식입니다. 가장 중요한 부분은 a와 b 모두 배열내 전체 원소값들의 갯수는 4개라는 점입니다. 이래야만 REFORM 함수가 제대로 돌아갑니다. 그렇지 않다면 다음과 같이 제대로 돌아가지 않고 오류를 냅니다.


IDL> b = REFORM(a, 3, 2)

% REFORM: New subscripts must not change the number elements in A.

% Execution halted at: $MAIN$          


따라서 100개 짜리 1차원 배열을 10X10의 2차원 배열로 바꾼다든지, 30X20의 2차원 배열을 600개 짜리 1차원 배열로 바꾼다든지, 또는 8X8의 2차원 배열을 4X4X4의 3차원 배열로 바꾼다든지 하는 작업들이 모두 REFORM 함수를 사용하면 가능합니다. 물론 원본과 결과 배열의 원소 갯수가 유지된다는 전제하에서입니다.


앞선 예제에서 1차원 배열을 2차원 배열로 변형할 경우, 값들의 배정 방향이 row가 우선이고 column은 나중이었는데요. 만약 그 반대의 형태, 즉 column 우선에 row 나중에 해당되는 형태로 결과를 얻고자 한다면 어떻게 하면 될까요? 당연히 방법이 있습니다. 바로 TRANSPOSE라는 내장함수를 사용하는 것입니다. 다음과 같이 하면 됩니다.


IDL> b = TRANSPOSE(REFORM(a, 2, 2))

IDL> PRINT, b

       1       3

       2       4


어쨌든 이 REFORM이라는 함수는 다양한 방향으로 응용이 가능합니다. 특히, IDL에서 사용 가능한 내장함수들 중에 입력인자가 반드시 1차원이 되어야 하는 경우들이 종종 있습니다. 그런데 막상 내가 갖고 있는 데이터는 2차원이나 3차원으로 되어 있는 상황이라면, REFORM 함수를 사용하여 1차원으로 변형한 후 입력인자로 활용하는 방식으로 작업을 하면 됩니다.


지금까지 2회에 걸쳐서 CONGRID와 REFORM 함수의 원리 및 활용 방법에 관하여 알아보았습니다. 어떤 프로그래밍 언어든 마찬가지겠지만, 배열 데이터를 처리하는 다양한 방법들을 적재적소에 잘 활용하는 것이 프로그래밍의 효율에 있어서 매우 중요합니다. 그런 측면에서, 이러한 함수들 역시 중요한 역할을 할 수 있다는 점 참조하시면 좋겠습니다.

반응형