Jonghyuk

게시판 답변이 생성됐습니다

15 글 보임 - 16 에서 30 까지 (총 174 중에서)
  • 글쓴이
  • 답변: ncdf파일 읽기 관련 질문드립니다. #2434
    Jonghyuk
    회원

    확장자가 .cdf 인 파일이네요.
    netCDF가 아니고 그냥 CDF 파일일 가능성이 높습니다.

    http://www.exelisvis.com/docs/CDF_OPEN.html

    CDF와 netCDF는 다른 포맷입니다.

    답변: 라이센스 문의드립니다. #2433
    Jonghyuk
    회원

    서버의 라이센스가 여전히 8.2 라면, 이 라이센스를 이용하여 8.4를 실행할 수는 없습니다(반대는 가능합니다).
    서버의 IDL 버전이 8.x인 것은 문제 없으나, 라이센스가 IDL 8.4 까지 실행할 수 있는 최신 라이센스가 아닌 경우 이런 문제가 발생할 수 있습니다.
    방안1. 서버의 라이센스를 업데이트 하세요(비용이 발생할 수 있습니다).
    방안2. 클라이언트의 IDL을 8.2.x 버전으로 사용하세요.

    8.2.x 에서 x에 해당하는 부분은 Service Pack 개념으로 업그레이드가 필요하지 않습니다. 즉 8.2, 8.2.1, 8.2.2, 8.2.3은 모두 같은 라이센스를 사용합니다. 하지만 8.3과 8.4는 다른 버전입니다.

    답변: log scale axis 관련 #2424
    Jonghyuk
    회원

    아래의 David Fanning 박사님의 글을 참고하시면 될 것 같습니다.

    http://www.idlcoyote.com/tips/exponents.html

    다음의 글도 도움이 될 수 있습니다.

    http://www.idl-envi.co.kr/callcenter/tips/view.php?num=34&page=4

    답변: convert_coord에 대해…. #2423
    Jonghyuk
    회원

    사실 convert_coord 함수의 사용법이 간단해서 자세한 설명을 하지 않는 것 같습니다.
    IDL Direct Graphics 체계에는 세가지 좌표계가 존재합니다.
    1. Data 좌표계 : 플롯을 그리면, 그 플롯의 X좌표, Y 좌표를 따릅니다. 지도의 경우 경위도가 되겠지요.
    2. Normal 좌표계 : 창의 맨 왼쪽이 0, 맨오른쪽이 1, 맨 아래쪽이 0, 맨 위쪽이 1이 되는 좌표계입니다. 창의 크기를 어떻게 늘리고 줄이든지, 창의 중심은 Normal 좌표계로 (0.5, 0.5)가 되겠지요?
    3. Device 좌표계 : 이는 출력 장치마다 좀 다른데, 대표적인 그래픽창은 픽셀로 카운트합니다. 디바이스 좌표계 (100, 100)은 왼쪽 아래로부터 100픽셀 오른쪽으로, 100픽셀 위쪽으로 위치합니다.

    이 세가지 좌표계로 상호 변환할 때 convert_coord 가 쓰입니다.
    Normal 좌표를 Device 좌표로 변환하고 싶으면?
    /NORMAL, /TO_DEVICE 키워드를 함께 쓰시면 되는 겁니다.

    답변: data grid 맞추기 #2399
    Jonghyuk
    회원

    griddata의 이름이 (irregular를 2차원배열로 만드는 것이어서) 안될 것처럼 보이지만, 2차원 배열을 irregular처럼 사용하고, XOUT, YOUT 키워드를 이용해서 알고자 하는 지점(들)의 X,Y좌표를 명시하면 해당 좌표값만 계산해 냅니다. 예를 들어, 우리나라 전역의 기상예보격자 기온 같은 것이 있다면(동네예보), 이것을 입력자료로 써서, 원하는 위경도(들)의 기온을 유추(내삽)할 수 있다는 것입니다.

    도움말을 보시면 확인되는데, Minimum Curvature 알고리즘과 Quintic 알고리즘은 무조건 격자형으로만 리턴을 하고, 나머지 알고리즘(IDW, KRIGING, Nearest Neighbour 등등)은 모두 XOUT, YOUT 키워드를 사용할 수 있습니다.

    답변: data grid 맞추기 #2389
    Jonghyuk
    회원

    griddata 라는 함수를 쓰면, 원하는 격자위치”들”의 추정값(인터폴레이션)을 계산할 수 있습니다. 반복문을 사용하지 않고 가능합니다. 속도문제는 해결 될 거라고 생각합니다.

    답변: IDL 최대 배열 수 #2384
    Jonghyuk
    회원

    이 문제는 딱히 답이 있지는 않습니다. 사용하시는 시스템에서 메모리를 할당해 보고 프로그램이 잘 돌아가는지 보시는 게 답이라고 생각합니다.

    1. 요즘의 64bit 운영체제에서는 사실상 메모리(RAM)이 많다면 꽤나 큰 배열 할당이 가능합니다. 그런데, 메모리의 크기가 RAM이 감당할 수 있는 크기를 넘어가면 Virtual Memory를 사용하게 되며(HDD의 일부를 RAM 처럼), 속도가 괴로울 정도로 느려집니다. 이건 원하시는 바가 아니라고 생각합니다. 참고로 예전의 32Bit 운영체제라면 2GB 이상의 메모리를 할당하는 것이 불가능했습니다. 아래 다른 이유로 물론 2GB 정도의 메모리를 다 쓰는 배열을 잡기는 불가능했습니다.

    2. 배열의 크기는 데이터 타입마다 다른데요, 1byte짜리 byte 형의 10000*10000 즉 bytarr(10000, 10000)이라면, 10000*10000*1 byte의 메모리가 필요합니다. 대략 100MB 정도 되는 크기네요. 이게 Double 형이라면 즉, dblarr(10000, 10000) 이면 10000*10000*8byte가 되므로 800MB 정도가 되는 크기입니다. 그러므로 배열의 요소 개수만 가지고 배열의 크기를 따지는 것은 의미가 없어 보입니다.

    3. 배열은 운영체제 안에서, 끊이지 않고 쭉 연결된 메모리 영역을 필요로 합니다. 즉, 아무리 많은 메모리가 있다고 해도, 처음부분에는 운영체제가 차지하고 있고, 중간부분은 어플리케이션들이 차지하고 있고, 마지막 부분은 하드웨어 디바이스 드라이버들이 차지하고 있다면(이보다 더 복잡하겠지만 쉽게 예를 들자면), 처음부터 끝까지 한통으로 쭉 이어진 메모리를 할당할 수가 없게 되고, 결국 우리가 예상하는 것 보다는 작은 크기의 배열만 사용할 수 있게 됩니다. 요즘은 운영체제가 개선되어서 이 부분이 많이 해소되었다고 들었습니다. 즉, 끊어져 존재하는 메모리도 한통으로 묶어 할당할 수 있게 하는 기술인데요, 윈도 계열보다 유닉스/리눅스 계열이 이 부분이 뛰어나다고 합니다. 이런 이유로 IDL 실행 당시의 운영체제 상황이 매번 다르기 때문에, 얼마 크기의 배열을 한통으로 잡을 수 있는지가 정답이 없습니다.

    4. 배열을 하나 선언하면 그것으로 원하는 바를 이루는 것은 아닙니다. 이를 이용한 계산도 해야 하고, 이를 다시 다른 변수에 저장도 해야 하고, 배열들 간의 계산도 해야 합니다. 그러므로 어떤 대단한 크기의 배열을 할당했다고 해서 OK가 아닙니다. 상황에 따라 이 배열의 몇 배 되는 공간이 필요할 것입니다. 대부분의 상황이 그렇습니다.

    저는 리소스가 넉넉한 리눅스 운영체제에서 Floating 형으로 40000*40000 정도의 배열은 할당해서 사용할 때가 있습니다. 그렇지만 납품용 프로그램을 개발할 때는 이렇게 하지는 않습니다. 이정도의 메모리를 할당할 수 있는 시스템을 보장할 수가 없거든요.

    참고로, 매우 큰 영상도 잘 처리하는 ENVI 소프트웨어(IDL로 만들었습니다)는 평범한 4GB RAM 을 가진 시스템에서도 잘 돌아갑니다. 영상을 타일로 쪼개서 처리하도록 개발했기 때문입니다. 물론 “나는 메모리 충분하다”라고 생각하시면 이 타일 크기를 늘릴 수는 있습니다.

    이런 이유로, 얼마나 큰 배열을 잡을 수 있나요 에 대한 답은… 사용하시는 시스템에서 필요한 일을 시도해 보시는 것이 답이라고 생각합니다.

    기술적 요약
    1. 시스템의 물리적 메모리 한계가 존재합니다. HDD를 이용한 Virtual Memory라는 게 존재하지만 이를 가능하면 안쓰는 것이 정신 건강에 좋습니다.
    2. 운영체제가 가지는 메모리 한계가 존재합니다. 특히 32bit 운영체제는 하드웨어적 RAM이 얼마가 되든지 2GB 정도의 메모리만 할당이 가능합니다.
    3. 조각난 메모리의 효용성 한계가 존재합니다. 여러개의 작은 배열을 잡는데는 문제가 없지만, 큰 배열 하나를 잡는데는 한계가 있습니다.
    4. Data Type에 따라 같은 element 수의 배열이라도 메모리상 차지하는 공간의 크기는 많이 차이납니다.
    5. 배열 선언이 프로그램의 목적이 아니므로, 계산 과정에서 배열 크기의 여러 배에 해당하는 메모리가 필요해집니다.

    답변: 백그라운드 실행 #2364
    Jonghyuk
    회원

    그림창이 열리는 부분에서
    WINDOW, /PIXMAP

    과 같이 PIXMAP 키워드를 사용하시면 화면에 그림을 표출하지 않습니다. Video Memory 안에 그림을 그립니다. 보이지 않을 뿐 기타 모든 액션은 화면에 띄워놓은 Window와 같습니다.

    Jonghyuk
    회원

    Syntax Error는 어디에서 발생하는지 표시가 될 겁니다. 문법에러라서 고치기는 쉬운 편입니다. 어디가 잘못되었다고 나오는지요?

    그런데 File 복제라면 FILE_COPY 명령을 쓰시는게 Readfits&Writefits보다 효율적일 거라고 생각합니다.

    readcol, dir1+list1, filenames, format=’A’
    file_copy, dir0+filenames, dir2

    조금 손볼 곳이 있겠지만 전반적으로는 이정도면 될 것 같습니다.

    Jonghyuk
    회원

    tvimage도 예전 Fanning 라이브러리에 있던 명령어이고, 요즘 배포되는 Fanning 라이브러리에는 cgimage 명령으로 바뀌었습니다.

    cgimage, background=’white’, dist(100), ERASE=1, /AXIS

    와 같이 사용하면 될 것 같고, TVIMAGE 시절에는 background 키워드가 ‘WHITE’ 같은 문자열을 직접 받지는 못했던 것으로 기억합니다. 대신 tvimage 에는 /WHITE 라는 키워드가 있었습니다.

    IDL의 IMAGE() 함수는 8.x 부터 사용할 수 있는데, 기능이 조금씩 추가되고 있어서 현재버전인 8.4 버전이 말씀하신 링크 도움말에 해당되는 버전입니다.

    답변: 글자 안 잘리게 하는법 #2338
    Jonghyuk
    회원

    글자가 잘린다는게, 어떤 의미인지 잘 모르겠습니다만, PS의 사이즈가 너무 작아서 그런 것이 아닌가 추측할 뿐입니다.

    폰트는 Direct Graphics에서 Postscript를 만들 때 다음 글을 참고하시면 좋을 것 같습니다.
    http://www.idlcoyote.com/tips/ps_psfonts.html

    Jonghyuk
    회원

    call by reference 라고 해서, 대부분의 프로그래밍 언어가 제공하는 모듈 간의 자료 전달 방식인데요,
    IDL에서는 변수 명을 이용해서 호출하면, 함수쪽에서 그 변수의 값을 실제로 바꿀 수 있게 됩니다.

    myfunct(x, y, z)

    과 같이 호출하면 myfunct 함수에서 이에 해당하는 변수 예를 들면,
    function myfunct, a, b, c

    에서 a, b, c 에 해당하는 값이 내부적으로 바뀔 때, 나중에 호출하는 쪽의 x, y, z 도 바뀌어 있게 됩니다.
    call by reference 라는 이름 그대로, “지금 내가 아예 자료가 저장되어 있는 메모리를 통채로 넘겨 주니, 이 안의 값을 고치던 퍼가든 마음대로 하세요” 라는 식의 자료 전달입니다. 이번 사례에서는 불편하셨는지 몰라도, 이게 사용자의 의도일 경우가 종종 있습니다.

    이와 반대가 되는 것으로 call by value 라는 호출방식이 있는데,
    IDL에서는 “변수이름 직접 전달”을 제외하고는 모두 call by value 입니다. 즉, 호출되는 프로그램이 리턴할 때, 이 값을 바꾸지 못해요. 사실
    myfunct(1, 2, 3)
    이라고 호출하면, 1, 2, 3을 다른 값으로 바꿀 방법도 없잖아요. 이게 call by value 입니다.

    정히, call by reference 가 아니게 즉, 보내는 값은 바꾸지 못하게 하고 싶으시면.
    myfunct(x+0, y+0, z+0)
    과 같이 의미 없는 수식을 만들어 보내는 방법도 있습니다.

    Jonghyuk
    회원

    꽤 복잡한 코드입니다.
    일단, 아래 부분을 IDL이 인식하는 상황인지요?

    data=[[data1],[data2],[data3],[data4],[data5],[data6],[data7]]

    아래 부분은 IDL이 잘 처리할 것 같긴 한데,
    if (month le 9) then month_s=’0’+strtrim(month,2) else month_s=strtrim(month,2)
    다음과 같이 처리하는 것이 더 일반적입니다.
    month_s=string(month, format='(I02)’)

    Jonghyuk
    회원

    IDL> loadct, 39
    % LOADCT: Loading table Rainbow + white
    IDL> tvlct, r, g, b, /GET
    IDL> print, r[215], g[215], b[215]
    255 119 0
    IDL> tvlct, rgb, /GET
    IDL> help, rgb
    RGB BYTE = Array[256, 3]
    IDL> print, rgb[215, *]
    255
    119
    0

    답변: 2D data interpolation #2305
    Jonghyuk
    회원

    안녕하세요.

    원자료가 최종적으로 원하는 격자크기보다 더 촘촘한 자료라서… 더 간단한 방법으로 처리하는 게 효율적이지 않을까 하는 생각도 있습니다.

    일반적으로 무난하게 KRIG2D 함수 같은 것을 사용하시면 어떨까 합니다. 도움말을 찾아 보시면 좋은 예제들이 있습니다. 옵션이 다양하긴 한데, 예제 보시면 사용이 복잡하진 않습니다.

    혹시 IDL 8.2 버전대 또는 그 이하 버전을 사용하면, 아래 링크를 한번 검토해 보십시오.

    http://blog.daum.net/swrush/228

15 글 보임 - 16 에서 30 까지 (총 174 중에서)