Jonghyuk

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

15 글 보임 - 1 에서 15 까지 (총 174 중에서)
  • 글쓴이
  • 답변: 음;;;과연 답글이 달릴까싶지만;;; #5904
    Jonghyuk
    회원

    안녕하세요.
    ENVI_GET_MAP_INFO는 예전의 루틴으로 새로운 ENVI 체계에서는 사용되지 않습니다.
    다음 방법을 통해 원하시는 정보를 확인할 수 있는지 검토해 보십시오.

    ENVI> e=envi() ;이제부터 e 변수가 ENVI입니다.

    ENVI> file=’D:\L1C_T52SCE_A027199_20220522T022240\S2B_MSIL1C_20220522T021609_N0400_R003_T52SCE_20220522T042321.SAFE\MTD_MSIL1C.xml’

    ENVI> raster = e.OpenRaster(file) ; ENVI에서 RASTER 열기를 실행합니다.
    ENVI> spatialRef = raster[0].SPATIALREF ; Sentinel-2 영상은 해상도에 따라 네 가지 영상이 하나의 파일에 들어 있습니다. 그 중 맨 앞에 것(해상도 10m 영상) raster[0]의 공간좌표체계를 뽑아냅니다.

    ENVI> print, spatialRef
    ENVISTANDARDRASTERSPATIALREF <269537>
    COORD_SYS_CODE = 32652
    COORD_SYS_STR = ‘PROJCS[“WGS_1984_UTM_Zone_52N”,GEOGCS[“GCS_WGS_1984”,DATUM[“D_WGS_1984”,SPHEROID[“WGS_1984”,6378137.0,298.257223563]],PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]],PROJECTION[“Transverse_Mercator”],PARAMETER[“False_Easting”,500000.0],PARAMETER[“False_Northing”,0.0],PARAMETER[“Central_Meridian”,129.0],PARAMETER[“Scale_Factor”,0.9996],PARAMETER[“Latitude_Of_Origin”,0.0],UNIT[“Meter”,1.0]]’
    PIXEL_SIZE = 10.000000, 10.000000
    ROTATION = 0.0000000
    TIE_POINT_MAP = 300000.00, 4000020.0
    TIE_POINT_PIXEL = 0.0000000, 0.0000000

    답변: read_csv를 이용한 파일 읽기 #5812
    Jonghyuk
    회원

    안녕하세요. 답변이 너무 늦었습니다. 여기에 너무 오랜만에 들어와 보기도 했고, 요 며칠간 이 사이트에 접속에 장애가 있었습니다.

    READ_CSV는 콤마로 분리만 되어 있는 파일이라면 정말 유용합니다.
    올려주신 데이터로(일부겠지만) 네줄짜리 파일을 만들어서 읽을 떄 굳이 타입을 지정할 필요도 없습니다.

    data=read_csv(file)

    이 한줄만으로도 잘 읽습니다. 첫 컬럼은 String으로, 두번째 컬럼은 Long으로, 세번째 컬럼부터는 Double로 읽습니다. 요즘 컴퓨터 사양들이 좋으니 웬만하면 메모리 두배씩 소진하더라도 골치 안아프게 16-bit integer 대신 32-bit long integer로 읽고, 32-bit float 대신 64-bit double 로 읽어버리는 전략입니다(이러한 원칙은 도움말에 잘 나와 있습니다). 더 풍요로운 데이터 타입으로 읽으면 아무래도 사고가 없거든요.

    그럼에도 타입을 지정해 주면, 타입에 맞추어 읽습니다. 제가 다음 코드도 실행해 보았습니다.

    data=read_csv(file, types=[‘string’, ‘float’, ‘float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’,’float’])

    물론 위 코드에서 string 다음에는 사실상 정수이기 때문에 long이나 int로 하는 것이 더 좋겠지만, 궁금해 하시는 부분이어서 위와 같이 돌려 보았고, float로 잘 읽힙니다.

    IDL> help, data
    ** Structure <389b3010>, 30 tags, length=528, data length=528, refs=1:
    FIELD01 STRING Array[4]
    FIELD02 FLOAT Array[4]
    FIELD03 FLOAT Array[4]
    FIELD04 FLOAT Array[4]
    FIELD05 FLOAT Array[4]
    FIELD06 FLOAT Array[4]
    FIELD07 FLOAT Array[4]
    FIELD08 FLOAT Array[4]
    FIELD09 FLOAT Array[4]
    FIELD10 FLOAT Array[4]
    FIELD11 FLOAT Array[4]
    FIELD12 FLOAT Array[4]
    FIELD13 FLOAT Array[4]
    FIELD14 FLOAT Array[4]
    FIELD15 FLOAT Array[4]
    FIELD16 FLOAT Array[4]
    FIELD17 FLOAT Array[4]
    FIELD18 FLOAT Array[4]
    FIELD19 FLOAT Array[4]
    FIELD20 FLOAT Array[4]
    FIELD21 FLOAT Array[4]
    FIELD22 FLOAT Array[4]
    FIELD23 FLOAT Array[4]
    FIELD24 FLOAT Array[4]
    FIELD25 FLOAT Array[4]
    FIELD26 FLOAT Array[4]
    FIELD27 FLOAT Array[4]
    FIELD28 FLOAT Array[4]
    FIELD29 FLOAT Array[4]
    FIELD30 FLOAT Array[4]

    질문하신 내용이 아예 안읽히는 것이면 뭔가 잘못되었겠지 라고 저도 생각할텐데, 현재 문의하신 내용은 TYPES 키워드가 효력을 발휘하지 못하는 상태라서, 상황이 잘 이해가 가지 않습니다. 제가 IDL 8.7.2는 없지만, IDL 8.8, IDL 8.7.3 그리고 IDL 8.5.1 에서 실행해 보았는데 다 잘 읽힙니다. 버전 문제인 것 같지는 않습니다.

    이상우 박사님 블로그에 있는 대로 따라해 보아도 다 잘 되는 것으로 확인하였습니다.

    원인은 그래서 잘 모르겠습니다. 그런데, 현재 상태로(float가 아닌 double로 읽힘) 그냥 사용하시는 데에 문제가 있을까요?

    read_csv가 참 편리한 점은, 다음과 같이 지정해도 잘 읽는다는 것입니다.

    IDL> data=read_csv(file, types=[“string”, “int”])
    IDL> help, data
    ** Structure <31d79140>, 30 tags, length=968, data length=968, refs=1:
    FIELD01 STRING Array[4]
    FIELD02 INT Array[4]
    FIELD03 DOUBLE Array[4]
    FIELD04 DOUBLE Array[4]
    … 이하 생략….

    Double이 Float의 상위 호환이어서 그대로 쓰시는 데에 문제는 없을 것 같습니다만, 어쨌든 TYPES 키워드가 효력이 없는 상황은 좀 이상하긴 합니다.

    혹시 다음과 같은 테스트를 해 보면 어떨까요?
    IDL> data=read_csv(file, types=[“hello”])
    % READ_CSV: Unknown type string: “hello”
    % Execution halted at: $MAIN$
    어이없긴 하지만, TYPES 키워드가 파라메터를 받아들이고 있긴 한 건지 확인은 될 것 같습니다.

    • 이 답변은 Jonghyuk에 의해 3 years, 1 month 전에 수정됐습니다.
    답변: Erroplot 에서 Symbol과 Error Bar 순서 #5752
    Jonghyuk
    회원

    안녕하세요.
    두번에 나누어 그리면, ErrorBar를 먼저 그리고, 그 위에 심볼을 그릴 수 있을 것 같습니다.
    예를 들면, 다음과 같이 처음 ErrorPlot을 사용할 때에는 심볼을 그리지 않고(symbol=’None’), 이후에 Plot으로 심볼만 다시 그리는 방식을 쓰면 어떨까 생각합니다. 이 때, /OVERPLOT 키워드를 사용하면 큰 어려움은 없을 것 같습니다.

    P1=ErrorPlot(x, y, yerr, symbol=’None’, ERRORBAR_CAPSIZE=0.05, LINESTYLE=6)
    P2=Plot(X, Y, Symbol=’d’, /SYM_FILLED, SYM_COLOR=’RED’, SYM_SIZE=1, LINESTYLE=6, /OVERPLOT)

    답변: 지도표출질문드립니다. #5536
    Jonghyuk
    회원

    xloadct, 23
    IDL> xloadct, 23
    IDL> xpalette

    xloadct, 23, ncolors=10
    IDL> xloadct, 23, ncolors=10
    IDL> xpalette

    xloadct, 23, ncolors=10, bottom=128
    IDL> xloadct, 23, ncolors=10, bottom=128
    IDL> xpalette

    답변: 지도표출질문드립니다. #5532
    Jonghyuk
    회원

    colorbar 라는 라이브러리가 coyote 라이브러리라고 생각합니다. coyote 라이브러리는 한번은 업데이트 하셔야 할 것 같은데, 가장 최근 버전에서 colorbar는 cgcolorbar로 이름이 바뀌었습니다.

    David Fanning의 coyote library에서 colobar(cgcolorbar)는 DIVISION과 NCOLORS를 지정할 수 있는데, 이 때, NCOLORS=NC라고 하면, 컬러바에서 사용하는 색은 0부터 NC-1 까지의 색상을 가져옵니다. BOTTOM을 지정하면, 컬러바에서 사용하는 색은 BOTTOM값에서 BOTTOM값+NC-1 까지의 색상을 가져오게 됩니다.
    위 코드에서 사용한 것처럼, BOTTOM=231, NCOLORS=8 이면, 231, 232, 233, 234, 235, 236, 237, 238 번의 8개 색상을 가져다 씁니다. 위 코드처럼 23번 컬러테이블을 쓴다면, 231번은 좀 어두운 주황색이고, 232~238번은 모두 비슷한(조금씩 더 붉은색이 짙어지는) 주황색이 될 것입니다. 올려주신 그림의 컬러바가 그렇게 보일 것입니다.

    이에 반에 Contour에서는 C_COLOR 키워드에 c 변수에 해당하는 값을 넣어 줌으로써, 23번 컬러테이블의 전 범위를 넓게 사용하고 있습니다. 이 차이를 맞춰야 하는데, COLORBAR를 위와 같이 쓰실 계획이면, 사용하고자 하는 색상 9개를 컬러테이블에 올려 놓는 것이 좋습니다.

    LOADCT, 23, NCOLORS=10

    위와 같이 하였을 때, 23번 컬러테이블을 10개로 균등분할하여, 샘플링하고, 이를 컬러테이블 번호 0번부터 9번까지 채워 넣습니다. 0번은 검은색으로 컬러바에서 안쓸 색이기 때문에, 10개를 불러왔습니다.

    c=indgen(9)+1

    이렇게 하여 Contour에서 1번부터 9번까지의 색을 사용하도록 합니다.

    cgcolorbar, position=[0.97,0.10+0.02,0.99,0.10+0.75], DIVISIONS=8,$
    NCOLORS=8, bottom=1, format='(A1)’, /vertical, color=0, charsize=1.5, charthick=1.

    저는 과거의 colorbar 프로시저를 확인하지는 못했지만,cgcolorbar가 비슷할 것으로 생각합니다. 위와 같이 NCOLORS=8로 하고 Bottom을 1로 하여 1번부터 8번 컬러까지 사용하도록 지정합니다.

    그리고 FOMRAT='(A1)’으로 처리하면 눈금값이 출력되지 않습니다. 뒤에서 xyouts로 눈금값을 직접 출력하기 때문에, colorbar의 눈금값 출력을 막아 버리는 것이 좋겠습니다. 혹시, 유용할지 모르니, cgcolorbar 명령에, /YLOG 키워드가 있다는 것도 검토해 보십시오. 눈금값을 지수스케일로 지정합니다.

    MAP_GRID 명령을 쓸 때, LATDEL=5, LONDEL=5 로 5도 간격으로 눈금값을 표출하게 설정하면 경위도 눈금값이 겹쳐 보이지 않습니다.

    답변: ndvi mean 값 산출 #5501
    Jonghyuk
    회원

    ENVI의 API를 사용하는 코드인데, ENVI 라이브러리 로딩이 되어 있지 않아서 발생하는 문제입니다.
    ENVI를 로딩하지 않은 상태의 IDL에서는 지금 에러메시지가 나는 ENVI_ 로 시작하는 함수들을 인식할 수 없어 문법 에러로 처리합니다.
    아래와 같이 ENVI를 띄워 놓고 프로그램을 실행해 보십시오.
    IDL> envi
    % Restored file: ENVI.
    % Restored file: ENVI_M01.
    % Restored file: ENVI_M02.
    % Restored file: ENVI_M03.
    % Restored file: ENVI_M04.
    % Restored file: ENVI_M05.
    % Restored file: ENVI_M06.
    % Restored file: ENVI_M07.
    % Restored file: ENVI_M08.
    % Restored file: ENVI_D01.
    % Restored file: ENVI_D02.
    % Restored file: ENVI_D03.
    % Restored file: ENVI_CW.
    % Restored file: ENVI_IDL.
    % Restored file: ENVI_IOW.
    % Restored file: ENVI_RV.
    % Loaded DLM: IDLJSON.

    ENVI 어떤 버전을 사용하시는지 모르겠으나, 지금 작성하신 코드는 ENVI Classic(ENVI 4.8까지의 ENVI의 유일한 인터페이스) 스타일의 API입니다. 최신 버전에서도 ENVI Classic이라는 이름으로 예전의 ENVI를 지원하기 때문에 아마 실행에는 문제가 없을 것으로 생각합니다.
    어쨌든 프롬프트가
    IDL>
    이 아닌
    ENVI>
    상태에서 실행이 되어야 합니다.

    답변: tvscl 문의 #3014
    Jonghyuk
    회원

    일단 영상이 잘 읽혔는지 확인해 보기 위해서는 iimage (i가 두개입니다)를 이용하면 될 것 같습니다.
    IDL> iimage, data
    Zoom 버튼이나 스크롤바 등을 이용해서 영상을 확인할 수 있습니다.

    같은 목적으로 slide_image 도 유용하게 쓰일 수 있습니다.
    IDL> slide_image, data

    답변: 비교 후 최댓값을 가진 변수 도출 #2967
    Jonghyuk
    회원

    세 개의 크기가 같은 2차원 배열 r, s, t가 다음과 같이 있는 상황입니다.

    r=randomu(seed, 4, 3)
    s=randomu(seed, 4, 3)
    t=randomu(seed, 4, 3)

    이러한 2차원 배열을 층으로 쌓아서 3차원 배열을 만들 떄 다음과 같이 할 수 있습니다.

    x=[[[r]], [[s]], [[t]]]

    참고로 xxx=[r, s, t] 와 같이 그냥 붙이면 1차원 방향으로(관념적으로 오른쪽으로 붙이기), xxx=[[r], [s], [t]] 와 같이 대괄호를 한번 감싸면 2차원 방향으로(관념적으로 아래로 붙이기), xxx[ [[r]], [[s]], [[t]] ] 와 같이 대괄호를 두 번 감싸면 3차원 방향으로(관념적으로 층으로 붙이기) 배열을 통합할 수 있습니다. 이러한 방법에 대해서 아래 링크를 보시면 좋습니다.
    http://blog.daum.net/swrush/166

    RANDOM으로 값을 만들었으니 상황마다 다르겠지만, 저는 다음과 같은 3차원 배열이 만들어졌습니다.

    IDL> print, x
    0.567786 0.761500 0.980104 0.0874583
    0.194464 0.410251 0.430641 0.0446276
    0.326077 0.687990 0.855732 0.0298006

    0.731714 0.524717 0.0772581 0.913978
    0.612994 0.137836 0.00728686 0.153460
    0.436454 0.989235 0.201311 0.608019

    0.596287 0.320769 0.0136553 0.968783
    0.768057 0.723100 0.473770 0.752396
    0.864415 0.512420 0.0393057 0.740206

    맨 위의 4*3 배열이 0층(사실상 r변수), 두번째 4*3 배열이 1층(s 변수), 세번째 4*3 배열이 2층(t 변수)입니다.

    MAX 함수에는(당연히 MIN 함수도) DIMENSION 이라는 키워드가 있어서 최대값을 결정하는 방향을 지정할 수 있습니다. 예를 들어 DIMENSION=3 이라고 하면 3차원 방향으로 최대값을 찾습니다.

    IDL> mx=max(x, dimension=3)

    IDL> print, mx
    0.731714 0.761500 0.980104 0.968783
    0.768057 0.723100 0.473770 0.752396
    0.864415 0.989235 0.855732 0.740206

    일단 이런 식으로 세 개의 2차원 배열에서 각 좌표의 최대값을 찾을 수 있겠습니다.

    다음으로, IDL의 MAX(또는 MIN) 함수에는 두 개의 인자를 줄 수 있습니다. 첫 인자는 최대값을 찾는 대상이고, 두 번째 인자는 변수로 세팅해야 하는데, 이 변수에 “최대값(또는 최소값)의 위치”를 알려줍니다. 이렇게 사용하실 수 있는것입니다.

    IDL> mx=max(x, wh_mx, dimension=3)

    이렇게 하면 두번째 인자 wh_mx 에 “최대값이 있는 곳(index 번호)”이 저장됩니다.

    IDL> print, wh_mx
    12 1 2 27
    28 29 30 31
    32 21 10 35

    IDL의 배열 인덱싱은 차원에 상관없이 첫번째 Element를 0번으로 시작해서 1씩 증가하도록 하는 체계가 있습니다. 3*4 배열 3개를 다루니까, 이 상황에서는 36개의 요소가 있고, 0부터 35번까지 인덱스 번호를 가지게 됩니다. 이는 N 차원에 무관하게 배열을 다루고자 하는 프로그래밍의 편의성을 가지기 위한 체계인데, 사람이 이해하기는 조금 덜 편한 점은 있습니다. 이에 대한 이해는 다음 링크를 보시면 좋습니다.

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

    어쨌든, 최대값은 r, s, t 중 누가 가지고 있는가를 알고자 하면, 위 번호를 2차원 배열 개수 (여기서는 3*4)로 나눈 몫(정수부)을 계산하여 알 수 있습니다.

    IDL> print, wh_mx / (n_elements(r))
    1 0 0 2
    2 2 2 2
    2 1 0 2

    좌표 (0, 0) 왼쪽 상단은 s 변수에 최대값이 있고(값 1의 의미), 좌표 (3, 2) 우측 하단은 t 변수에 최대값이 있습니다(값 2의 의미).

    요약 : 같은 크기의 2차원 배열을 3차원으로 통합하면 편해지는 경우가 있습니다. MAX나 MIN 함수에 DIMENSION 키워드를 이용하여 특정 차원 방향의 최대,최소를 찾을 수 있습니다. MIN이나 MAX 함수의 두번째 인자는 해당 최소,최대값의 위치(index)를 알려줍니다.

    • 이 답변은 Jonghyuk에 의해 7 years, 6 months 전에 수정됐습니다.
    Jonghyuk
    회원

    정확한 원인을 진단하기는 어렵지만, OpenGL 과 관련된 Driver 설정이 문제가 있다고 보여집니다. 이 문제는 사실 일반적으로 해결하기는 쉽지 않습니다. Video 처리장치 (예를 들어 GeFORCE나 Radeon 등)가 OpenGL 리눅스 표준을 잘 지원하는지, 또는 이에 맞는 드라이버가 설치된 것인지 등을 파악하는 것이 쉬운일이 아닐 수 있습니다. 만일 현 상황이 이 문제라면, 이는 CentOS와 그래픽카드의 문제입니다.
    HW가 같은 것인지는 모르겠으나 현재 설치하신 Ubuntu의 경우에는 이 문제가 없거나, 아니면 사실상 그래픽카드가 Native OpenGL을 지원 안하는 모드로 운영체제 설정이 되어있을지도 모릅니다. 대부분의 최신 그래픽카드들이 Linux 지원에 당장은 소홀한 상태로 출시되는 것이 현실입니다(Windows 위주로 개발되어 출시하고 시간이 지나면서 Linux 호환도 차차 맞추어 가게 되는 것 같습니다). Ubuntu의 경우 출시 주기가 6개월 정도이기 때문에, 출시 주기가 수년이 되는 CentOS 보다는 새로운 하드웨어에 대한 적응성도 뛰어나 보입니다.
    – 그래픽카드 드라이버 문제라는 확신은 없습니다만, 그래 보입니다.
    – 이 경우 그래픽카드 드라이버를 잘 설정하는 방법을 찾는 것은 – 운영체제가 알아서 잡아주지 않는다면 – 쉬운 일은 아닌 것 같습니다.
    – 이 상황이 맞다면, IDL에서 OpenGL 렌더링을 HW가 직접하지 않고 SW가 하게 하면 쉽게 해결되는 경우가 대부분입니다.

    방법은 아래와 같습니다.

    – IDLDE(Workbench)의 메뉴에서 창-> 환경설정으로 들어갑니다.
    – 환경설정 창에서 좌측에 IDL 항목이 있고 그 하위에 그래픽 항목이 있습니다. 이를 선택합니다.
    – 이제 우측을 보면, “개체 그래픽의 렌더링 방법”이 있는데, 디폴트는 하드웨어로 선택되어 있습니다. 이것을 소프트웨어로 선택하고
    – “적용” > “확인” 버튼을 눌러 빠져나옵니다.
    – IDL을 다시 시작합니다.

    이후 New Graphics를 사용하면 잘 될 가능성이 높습니다.

    또는 아예 워크벤치(IDLDE)로 들어갈 수 없는 환경인 경우,
    개인 홈디렉토리 아래의 IDL 설정파일에 이 내용을 추가하면 됩니다.
    ~/.idl/idl/pref-10-idl_8_x-unix/idl.pref 파일을 열어 보면 #으로 시작되는 주석문만 일단 있을 것입니다. 맨 아래에 다음 내용을 추가하십시오.

    IDL_GR_X_RENDERER : Software

    몇줄을 띄는 지 몇 칸을 띄는지는 별로 중요하지 않습니다.

    답변: mrdfits로 대용량 fits파일 읽기 #2910
    Jonghyuk
    회원

    MRDFITS 검색을 해 보니 2014년 수정판 V2.23에서 Very Large File 에 대한 Test를 했다고 기록이 나옵니다. 혹시 사용하시는 IDL Astro Library가 최신판인지 확인해 보십시오.

    12GB 파일을 정말로 메모리에 탑재하고자 한다면, 일단 사용하시는 워크스테이션의 메모리가 충분해야 할 것 같고, 64BIT OS(우분투 버전보다 64bit 운영체제인지가 더 중요할 것 같습니다)여야 할 것 같습니다. IDL의 최신 버전을 사용하신다면, 일단 운영체제는 64BITS 일 것으로 생각됩니다.

    ROWS= 키워드와 COLUMNS= 키워드가 있네요. 이를 이용하여 원하시는 행과 열을 지정할 수 있는 것 같습니다. 어차피 12GB를 한번에 메모리에 올려서 작업하는 것은 일반적인 상황은 아니므로, 이를 이용하여 해결할 수 있는지 검토해 보십시오.

    Jonghyuk
    회원

    .run은 다른 프로그램 안으로 들어갈 수 “없는” 명령어입니다.command line에서만 받아들일 수 있는 명령어인데, 점(.)으로 시작하는 명령어들이 다 그렇습니다. 같은 맥락으로 .reset 같은 것이 있습니다. .reset을 보면 웬지 프로그램 안에 들어가면 큰일 날 수 있겠다는 생각이 듭니다. 전통적으로 점(.)으로 시작하는 명령어들은 아주 오래전, 개발 환경과 그에 딸린 버튼, 단축키 등이 없던 시절에, 그 버튼과 단축키들의 역할을 했던 명령들입니다. 여전히 유효하고 유용하게 명령창에서 쓰입니다.

    평소에 .run으로 실행시키던 프로그램이라면 Batch script는 아닐 것이라 생각됩니다. 맨 아래 end 문이 있는 거죠.

    프로시저 형태로 만들어 호출하는 것이 가장 좋습니다.

    a=10
    print, a
    end

    위와 같이 맨 위에 선언부가 없고 아래 end가 있는 프로그램을 main program 이라고 하며, IDL이 시작하면 기본적으로 제공되는 메모리 공간에서 실행됩니다(기억 안하셔도 됩니다). 프로그램을 .run으로 실행시키고 나서 확인해 보면 a 변수 값이 그대로 남아 있지요.

    IDL> print, a
    10

    이는 현재 작업중인 메모리 공간이 $MAIN$ 이라는 공간이기 때문입니다.

    프로시저 선언을 하게 되면 상황이 좀 달라집니다.

    pro test_dot_run
    a=25
    print, a
    end

    위와 같은 프로그램을 만들고 실행시키면 위 프로그램 영역 안에서는 a가 25이지만, 다시 프로그램이 종료되고 나오면 a=10(앞에 설정되었던)으로 돌아갑니다. test_dot_run 프로시저가 돌아가는 메모리 공간이 다르다는 것입니다. 이렇게 해서 test_dot_run 이 실행되는 독립성을 보장합니다(큰 프로그램을 만들 때 더 좋은 겁니다).

    이렇게 만들면 .run이 없어도 프로그램을 호출할 수 있습니다.

    test_dot_run 프로그램을 test_dot_run.pro 로 저장합니다. 이래야 합니다.

    그러고 나면 test_dot_run은 이제 명령어(프로시저)가 됩니다. 명령어를 우리가 정의한 거죠.

    프로그램 어느 위치에서라도 test_dot_run 이라고 쓰면 실행됩니다.

    답변: 문법의 의미를 모르겠습니다. #2623
    Jonghyuk
    회원

    1. 수식 안에서 부등호는 IDL 연산자로 쓰이는데, 최대값 또는 최소값을 지정합니다.

    > 1e-20 은 왼쪽에 있는 배열이 1e-20 보다는 커야한다는 의미입니다. 다시말하면, 최소값은 1e-20이고, 배열 중 1e-20 보다 작은 값들은 모두 1e-20 으로 대체됩니다. 올려주신 프로그램에서는 분모로 0이 들어가게 되면 위험하니까 그 위험을 방지하는 장치로 사용된 것 같습니다.

    IDL> a=indgen(10)
    IDL> print, a
    0 1 2 3 4 5 6 7 8 9
    IDL> print, a > 3 ;3을 최소값으로 지정함
    3 3 3 3 4 5 6 7 8 9

    2. LT(Less Than)이나 EQ(Equal) GT(Greater Than) GE, LE 는 양쪽의 값을 비교하여 참이면 1, 아니면 0을 리턴합니다. mask라는 배열이 새로 생기는 건데요, U와 (smax^2)을 비교해서 그 중에 U가 더 작으면 1, 그렇지 않으면 0으로 채워지는 배열을 만들어냅니다. 아래는 예시입니다.

    IDL> u=findgen(10)^2
    IDL> v=findgen(10)*3
    IDL> print, u
    0.0 1.0 4.0 9.0 16.0 25.0 36.0 49.0 64.0 81.0
    IDL> print, v
    0.0 3.0 6.0 9.0 12.0 15.0 18.0 21.0 24.0 27.0
    IDL> mask=u lt v
    IDL> print, mask
    0 1 1 0 0 0 0 0 0 0

    Jonghyuk
    회원

    “ENVI+IDL 에서는 잘 되는데”라는 말씀과 “ENVI>> 로 들어왔고” 라고 하신 부분이 서로 이해가 되지 않습니다. 프롬프트가
    ENVI>
    라고 되어 있다는 것은 ENVI+IDL 상태라는 것으로 해석할 수 있거든요. 이 둘의 차이가 어떤 것을 말씀하시는 것인지 제가 파악을 못했습니다.

    보기에 좀 이상한 점은,
    @XXXX
    라고 하는 것은 실행되는 순간에 이 부분을 xxxx 파일로 대체하는 것입니다.

    IDL에서 경로상에 이들 파일이 안보인다면, 올려주신 것과 같은 Error가 나올 수 있습니다.
    IDL Workbench(개발환경)에서는 Workspace 디렉토리가 자동으로 경로로 잡힙니다. 그렇지만 CMD 모드(도스창)에서는 Workspace 디렉토리는 자동 경로로 잡히지 않습니다. 환경설정 부분에서 Workspace 디렉토리를 경로에 추가하는 시도를 한번 해 볼만 하다고 생각합니다.

    Jonghyuk
    회원

    에러문구 전문으로 올려주신 부분은 IDLDE(Workbench)에서 발생하는 에러로 보입니다. 이 부분은 현재 버전이 IDL 7.0으로 보이는데요, 이 때 IDLDE가 좀 무겁고 리눅스에서 설치가 안되거나 실행이 안되는 경우가 종종 있었습니다.

    아마 IDL로 다른 작업을 하실 때는 문제가 없으셨던 것 같은데,

    1) 불편하시겠지만 IDL Command Line 모드에서 프로그램을 실행하는 시도를 해 보십시오. IDLDE가 아닌 터미널에서 IDL을 실행해서 프로그램을 실행시키는 것을 의미합니다.

    2) Fatal Error라는 것이 어찌 보면 참 의미 없는 에러일 수 있는데요(원인을 얘기해 주지 않습니다), 혹시 프로그램 안에서 메모리를 계속 점점 더 차지하게 짜여진 부분(무한 메모리 필요)이 있지 않은지 검토해 보십시오. 아니면 파일을 Close 하지 않고 계속 Open 하는 부분이 있지 않을지 확인해 보십시오.

    3) 다른 버전의 IDL 사용을 시도해 보시는 것도 방법이 될 것 같습니다. 다른 OS, 다른 버전(8.x면 안정성 면에서 7.x와 차이가 좀 많습니다)을 시도해 보시면 좋겠습니다.

    답변: 중복되지 않는 임의의 수 (2) #2498
    Jonghyuk
    회원

    ex)1~10의 범위중 숫자 4개

    IDL> x=randomu(seed, 10) & y=sort(x) & print, y[0:3]+1
    1 7 6 3

    이런 걸 원하시는 건가요?

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