mwkim

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

4 글 보임 - 46 에서 49 까지 (총 49 중에서)
  • 글쓴이
  • 답변: PDF 파일 저장 버그 #2820
    mwkim
    회원

    말씀하신 것처럼 NaN값이 있을 때는 흑백으로 이상하게 저장되는 것 같습니다.

    아마 IDL> i.Save, ‘[파일이름].pdf’ 으로 저장하셨을 텐데

    /BITMAP 키워드를 사용하면 해결되는 것 같습니다.

    /BITMAP 키워드에 대한 설명은 IDL 도움말을 보시면 될 것 같고요…;;

    eps 파일은 확인해보지 않았지만 pdf 파일은 이 방법으로 해결되는 것 같습니다.

    답변: function 과 procedure 이름 중복 #2806
    mwkim
    회원

    함수와 프로시저가 이름이 같아도 문제는 없습니다.

    IDL 내장 기능 중에도 동일한 이름의 함수와 프로시저가 있고요.
    (IMAGE, CONTOUR, WINDOW 등)

    다만 사용자가 만든 함수나 프로시저의 경우,
    오사용의 가능성, 코드 관리의 어려움 등으로 추천하는 방법은 아닌 것으로 알고 있습니다.
    부득이한 경우가 아니라면 다르게 만드는 것이 좋지 않을까요?

    답변: grid interpolation 관련 질문 #2801
    mwkim
    회원

    올려주신 내용을 확인했습니다.
    우선 INSIDE 함수는 Coyote 라이브러리를 사용하셨을 것으로 예상하여 해당 함수를 사용하였습니다.

    확인 결과 값의 차이는 잘 모르겠으나 일부 영역에서 NaN 값이 나오는 것은 확인하였습니다.
    이 부분은 아마도 내삽을 할 때 NaN 값의 영향을 많이 받는 부분은 전부 NaN 값으로 계산되는 것이 아닐까 추측합니다.
    그래서 일부 영역은 값이 있었으나 주위의 NaN 값의 영향을 받아서 NaN 값으로 나온 것 같습니다.

    해결 방법은 아니지만, 다른 방법을 제안하자면 아래와 같습니다.
    작성하신 것과는 반대로 영역 내의 자료만 추출하여 내삽을 진행하는 방법을 사용하였습니다.
    다만 이렇게 하면 외삽 부분이 발생하기 때문에, 다시 영역을 잘라 주어야 하며,
    값의 일부는 외삽값이 됩니다.

    지난 번과 마찬가지로 flag 옵션을 통해 살펴보시면 될 것 같습니다.
    장단점을 살펴보자면, flag = 0 일 때는 NaN 값의 영향을 받는 모든 영역이 NaN이 됩니다(실제로 값이 있던 격자도). 하지만 값의 왜곡은 없어 보입니다.
    flag = 1 일 때는 추출하고자 하는 영역에 대한 값을 구할 수 있습니다. 하지만 외삽된 값이 사용됩니다.

    다만 값이 차이나는 경우는 저도 확인은 못해봤습니다(자료의 영향이 있을 수도 있을 것 같습니다.)

    =============================================

    PRO TEST_TRIGRID2

    flag = 0

    lat = [20:50:1]
    lon = [120:150:1]

    lonx = [128,138,140,146,142,130,128]
    laty = [34,38,46,44,35,31,34]

    lat_interpol = TRANSPOSE(REBIN(lat,31,31))
    lon_interpol = REBIN(lon,31,31)

    lat_cit = REFORM(lat_interpol,31*31)
    lon_cit = REFORM(lon_interpol,31*31)

    dtec_cit = HANNING(31,31)

    IF flag EQ 0 THEN BEGIN
    index = WHERE(INSIDE(lon_cit, lat_cit, lonx, laty) EQ 0 )
    dtec_cit_div = dtec_cit
    dtec_cit_div[index] = !VALUES.F_NAN
    ENDIF ELSE BEGIN
    index = WHERE(INSIDE(lon_cit, lat_cit, lonx, laty) EQ 1 )
    dtec_cit_div = dtec_cit[index]
    lon_cit_div = lon_cit[index]
    lat_cit_div = lat_cit[index]
    ENDELSE

    IF flag EQ 0 THEN BEGIN
    TRIANGULATE, lon_cit, lat_cit, tr
    grid = TRIGRID(lon_cit, lat_cit, dtec_cit_div, tr, [0.1,0.1], [120,20,150,50],XGRID=xgrid,YGRID=ygrid)
    ENDIF ELSE BEGIN
    TRIANGULATE, lon_cit_div, lat_cit_div, tr
    grid = TRIGRID(lon_cit_div, lat_cit_div, dtec_cit_div, tr, [0.1,0.1], [120,20,150,50],XGRID=xgrid,YGRID=ygrid,MISSING = !VALUES.F_NAN)
    xgrid_interpol= REFORM(REBIN(xgrid,301,301),301L*301L)
    ygrid_interpol= REFORM(TRANSPOSE(REBIN(ygrid,301,301)),301L*301L)
    index = WHERE(INSIDE(xgrid_interpol, ygrid_interpol, lonx, laty) EQ 0)
    grid[index] = !VALUES.F_NAN
    ENDELSE

    index = WHERE(INSIDE(lon_cit, lat_cit, lonx, laty) EQ 1)
    gridSample = grid[0:300:10,*]
    gridSample = gridSample[*,0:300:10]
    gridSample = gridSample[index]
    dataSample = dtec_cit[index]

    diff = ABS(gridSample – dataSample)
    PRINT, ‘Maximum different: ‘, MAX(diff[WHERE(FINITE(diff) EQ 1)])

    i1 = IMAGE(dtec_cit,lon,lat,LAYOUT=[2,1,1],MIN_VALUE = 0,MAX_VALUE = 1,TITLE = ‘Origin’)
    p1 = POLYLINE(lonx,laty,’r’,TARGET=i1,/DATA)
    i2 = IMAGE(grid,xgrid,ygrid,LAYOUT=[2,1,2],MIN_VALUE = 0,MAX_VALUE = 1,TITLE = ‘Interpolation’,/CURRENT)

    END

    • 이 답변은 mwkim에 의해 8 years 전에 수정됐습니다.
    • 이 답변은 mwkim에 의해 8 years 전에 수정됐습니다.
    답변: grid interpolation 관련 질문 #2792
    mwkim
    회원

    값의 차이가 어느 정도 인가요?

    일단 제가 확인했을 때는 값의 차이가 유의미하게 나지는 않았습니다.
    (값의 차이가 있기는 하지만 수치적인 계산 상에서 발생하는 정도였습니다. 10E-8 크기의)

    우선 제가 확인에 사용한 코드를 올려드립니다.(하단 참조)
    코드는 해닝함수 자료를 내삽하여 비교하는 코드입니다.
    원자료는 1도 간격으로 작성되었고, 내삽은 0.1도 간격으로 하였습니다.
    질문하신 내용에서 NaN 값의 이야기도 있어서 nanFlag 옵션으로 일정 구역에 NaN값이 나타나도록 하였습니다.

    전체 자료 표출(IMAGE)에서는 내삽 특성상 생기는 차이를 빼고는 괜찮았습니다.
    부분적으로 그래프(PLOT)를 그려보거나 지점값[15,15]을 비교했을 때도 동일하게 나왔습니다.

    그리고 지난번과 같이 일부지점에 대해서 TRIGRID 함수를 쓴 결과도 확인하였습니다.
    (별개의 문제로 TRIGRID 함수의 XOUT, YOUT 값에 따른 영향은 확인되었습니다. reverseCase 옵션)

    혹시 올려드린 코드를 참고하시고 문제가 발생한 코드와 어떤 차이가 있는지 설명해주실 수 있을까요?
    ——————–
    PRO TEST_TRIGRID

    nanFlag = 0 ;; 0: full data, 1: include NaN data
    reverseCase = 1 ;; 0: normal case, 1: reverse case

    lat = [20:50]
    lon = [120:150]
    lat = REBIN(lat,31,31)
    lat = TRANSPOSE(lat)
    lon = REBIN(lon,31,31)
    data = HANNING(31,31)

    IF nanFlag THEN data[4:6,14:16] = !VALUES.F_NAN

    TRIANGULATE, lon, lat, tr
    interpData = TRIGRID(lon,lat,data,tr,[0.1,0.1],[120,20,150,50],XGRID=interpLon,YGRID=interpLat)

    i1 = IMAGE(data,DIMENSIONS=[300,300],MARGIN=0,LAYOUT=[2,1,1])
    i2 = IMAGE(interpData,DIMENSIONS=[300,300],MARGIN=0,LAYOUT=[2,1,2],/CURRENT)

    p1 = PLOT(lon[*,11],data[*,11],’kD-‘,YRANGE=[0,1])
    p2 = PLOT(interpLon[*],interpData[*,110],’b+:’,YRANGE=[0,1],/CURRENT)

    PRINT, ‘origin data[15,15]: ‘, data[15,15]
    PRINT, ‘interpolation data[150,150]: ‘, interpData[150,150]
    PRINT

    PRINT, ‘longitude[15]: ‘, lon[15]
    PRINT, ‘latitude[15]: ‘, lat[15]
    PRINT

    interpPointData = TRIGRID(lon,lat,data,tr,XOUT=[135,125.5],YOUT=[35,25.5])
    IF reverseCase THEN interpPointData = TRIGRID(lon,lat,data,tr,XOUT=[125.5,135],YOUT=[25.5,35])

    PRINT, ‘interpolation point data: ‘, interpPointData[reverseCase,reverseCase]
    PRINT

    PRINT, ‘interpolation data[155,155]: ‘, interpData[55,55]
    PRINT, ‘interpolation point data: ‘, interpPointData[1-reverseCase,1-reverseCase]

    END
    ——————–

4 글 보임 - 46 에서 49 까지 (총 49 중에서)