Jonghyuk

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

15 글 보임 - 121 에서 135 까지 (총 174 중에서)
  • 글쓴이
  • Jonghyuk
    회원

    sando님 말씀대로입니다.
    아래와 같이 시도해 보시면 어떨까요?

    img= intarr(801,609,101)

    for i = 0, 100 do begin
    file = “c:\test\” + strtrim(string(i+1), 2) + “.jpg”
    read_jpeg, file, img1
    isz=size(img1)
    img1 =reform(img1[0,*,*],isz(2), isz(3))
    img[*,*,i] = img1
    endfor

    img1이 3채널 데이터인데, 이중 0번 채널만 추출하는 것으로 추측됩니다. 그래서 좌변이 img가 아니라 img1이 되는 것이 적당할 것 같습니다.
    img1(0, *, *) 도 허용이 되는 문법입니다만, 요즘에는 img1[0, *, *] 으로 브라켓을 사용하는 것이 권장됩니다. 함수 img1 과 배열 img1이 명시적으로 구분되는 장점이 있습니다.

    답변: hdf5 여러 파일 읽기 #953
    Jonghyuk
    회원

    http://www.spweather.com/idluser/bbs/view.php?id=idltip&page=4&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=89

    하나의 HDF5을 읽는 간단한 방법으로 위 링크를 검토해 보십시오. 앞서 답변드린, H5_Browser와 H5_Parse를 사용하는 예제입니다.

    여러개의 HDF5라고 해도

    1. H5_Browser로 하나의 파일의 형식을 확인한다. (나머지는 같을 거라고 가정)
    2. File_search로 목록을 확보한다.
    3. 반복해서 파일을 읽고 처리한다 (i=0~N-1)
    3-1. i 번 파일에 대해 H5_Parse로 HDD에서 메모리로 읽어 들인다.
    3-2. 원하는 작업을 수행한다.

    이쯤이 될 거라고 생각합니다.

    답변: 다수의파일open하기 #952
    Jonghyuk
    회원

    파일을 읽었다는 것은 아마도 파일의 목록을 FILE_SEARCH 등으로 확보했다는 말씀으로 보입니다.
    그 이후 각각의 파일에 대해 반복을 통해
    Open -> Read -> Close 의 순서를 파일을 읽는 것입니다. 즉, Open 이후에 Read 입니다.

    그런데 파일을 읽는 방법은 파일의 저장 형식에 따라 다릅니다. Open, Read, Close 의 틀만 고정이고 Read의 방식은 매우 유동적입니다.

    읽는 방법은 간단할 것으로 예상하는데, 파일이 어떻게 생겼는지를 확인해야 할 것 같습니다.

    답변: color table을 두개 사용할 수 있나요? #951
    Jonghyuk
    회원

    http://www.spweather.com/idluser/bbs/view.php?id=idltip&page=6&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=45

    위 링크를 한번 검토해 주십시오. 예전 글이어서 Display를 위해 colorbar 프로시저를 사용하고 있는데, 현재는 cgColorbar로 이름이 바뀌었습니다(Coyote Library). 하지만 Colortable Load하는 것은 loadct만 관련된 일입니다.

    그리고, 0값을 검은 색으로 대체하는 것만이 목적이시라면,

    loadct, 33

    이후에

    tvlct, 0, 0, 0, 0 ;R,G,B,배정값

    을 수행해 주는 것으로 충분하지 않을까 생각합니다.
    위 TVLCT 명령은, R, G, B 값을 주고 이 색을 N 번에 적재하라는 것입니다.

    TVLCT, R, G, B, N
    과 같이 씁니다. 물론 TVLCT는 컬러테이블에서 색 조합을 읽어오는 데도 사용될 수 있습니다.
    아주 많이 쓰이는 프로시저이므로 이것도 검토해 두시는 기를 권장합니다.

    답변: hdf5 여러 파일 읽기 #950
    Jonghyuk
    회원

    HDF5 여러개를 읽는 다는 것은 앞의 답변대로 하나의 HDF5을 읽는 작업을 반복하는 것이고, 파일의 목록을 구성하는 것은 FILE_SEARCH 함수를 이용합니다. 이것은 HDF5라고 다른 점은 없습니다.

    HDF5(또는 HDF도 마찬가지입니다)는 HDF5 입출력 루틴을 만드는 사람들(분명히 우리같은 일반 사용자는 아닙니다)에게는 뭔가 거창한 세계이지만, 우리같은 사용자들은 기본적인 규칙과, 이 파일 안에 어떤 내용이 어떤 계층으로 들어 있는지를 아는 것이 중요합니다. 천리안 위성영상 HDF5와 천문 분광 DB HDF5는 같은 HDF5 형식이지만 열어보면 완전히 다른 내용이 들어 있습니다. 그러므로 사용자가 열어 보고 싶은 HDF5의 구조를 확인하는 것이 중요합니다.

    H5_BROWSER 함수가 좋은 도구가 될 것입니다. 이를 이용해서 관심있는 HDF5의 저장 형태를 확인하십시오. 같은 시리즈의 HDF5는 모두 같은 구조로 저장되어 있을 것입니다.
    그 이후에 H5_ 로 시작하는 다양한 루틴들을 이용해서 원하는 데이터만 뽑아 쓰시면 됩니다. HDF5 안에 있는 모든 데이터를 다 뽑아 써야 할 이유도 없습니다. 어떤 필드 하나만 필요한 거라면, 그것만 뽑아서 사용하시면 됩니다.

    H5_PARSE 함수는 HDF5 파일을 통채로 IDL의 구조체로 가지고 오는 것으로 HDF5 파일 크기가 별로 크지 않다면 (몇 GB 안쪽이라면) 유용하게 쓰실 수도 있습니다. 일단 이 함수 한줄이면 HDF5 파일을 HDD에서 IDL의 메모리(구조체)로 가져올 수 있습니다. 그 이후에 구조체의 계층을 타고 필요한 필드를 꺼내올 수 있을 것입니다.

    답변: NaN 에 대해 질문있습니다. #933
    Jonghyuk
    회원

    새로 올려 주신 것과 같이 간단한 데이터 예제파일을 읽었다고 생각하면 배열에 다음과 같이 들어 있을 것입니다.

    D=[1,2,3,4,5]
    Kd_5=[10.1, 10.2, 10.3, 10.5, 10.7]
    kd=[!values.f_nan, !values.f_nan, 10.4, 10.6, 10.8]

    마지막 kd는 추측입니다. help, kd[0]
    과 같이 해 보시면 float 형의 NaN으로 들어 있는지 확인해 보실 수 있습니다.

    배열 번호는 0부터 시작하므로, 0, 1, 2, 3, 4 가 됩니다(다섯줄짜리 파일의 상황이라면)

    ok=where(finite(kd))
    를 실행하면 ok=[2,3,4] 가 될 것입니다. 0번과 1번에 해당하는 kd값은 유한수(finite함수가 체크하는 것이 유한수이냐 하는 것으로 NaN과 Infinity는 False로 리턴합니다)가 아니므로 2번, 3번, 4번이 조건을 만족한다고 리턴하는 겁니다.

    이후에는 kd_5[ok] 와 kd[ok] 만 가지고 작업을 진행하시면 될 것 같습니다.
    print, kd_5[ok] 를 해 보시면 10.3, 10.5, 10.7 이 될 것이고,
    print, kd[ok] 를 해 보시면, 10.4, 10.6, 10.8 이 될 것입니다.

    이 설명은 kd의 NaN 값이 IDL이 인식하는 수치형 NaN(문자열 아님)인 !values.f_nan으로 들어 있을 경우 유효합니다. mean() 같은 함수는 /NAN 키워드가 있어서 NaN을 제끼고 평균내는 기능도 있습니다.

    print, mean(kd, /NAN)

    답변: 윈도우창 출력화면 설정 #929
    Jonghyuk
    회원

    window, 0, xpos=2000, ypos=100

    과 같이 창이 열리는 위치를 지정해 주시면 어떨까요?

    답변: NaN 에 대해 질문있습니다. #928
    Jonghyuk
    회원

    데이터를 읽는 데는 문제가 없으셨는지요?
    어떤 방식으로 데이터를 읽으셨는지 모르겠습니다. 문자열로 읽어서 다시 숫자로 변환한 것인지…

    어쨌든 이런 상황에서 WHERE() 함수를 쓰는 것이 답일 것 같습니다. 상황을 정확히 모르겠으나,
    ok=where(finite(kd))
    c=regress(kdp[ok], kd_5[ok])
    와 같이 kd가 NaN이 아닌 것만 추려서 계산을 하고 플롯도 이와 같이 하시면 됩니다.
    그런데, NaN이 IDL이 인식하는 NaN으로 읽으신 것인지 문자열 NaN의 상태인지(그렇다면 다른 숫자도 사실상 문자열로 읽으신 것인지) 상황은 잘 모르겠습니다만 개요는 Where() 함수로 NaN이 아닌 행을 찾아서 그 행의 데이터만 사용하는 것입니다.

    답변: Strtrim 기능을 사용하는데에 있어서 #927
    Jonghyuk
    회원

    이런 방법으로 문제를 해결하는 것은 모범 답안은 아닙니다. c1_tr, c2_tr 같은 변수를 만드는 것 자체가 목적이 아니라면, 뒤쪽에서 계속 이 변수들이 등장할 텐데, 배열을 쓰는 것이 반복작업에는 “짱”입니다. 거의 필수적이라고 생각합니다.
    어쨌든 IDL에서 이런 상황은 다음과 같이 해결합니다.

    for i=1,5 do begin
    restore, ‘C:/summer_’+strtrim(string(i),2)+’.sav’
    print, ‘C:/summer_’+strtrim(string(i),2)+’.sav’

    cmd=’c’+strtrim(string(i), 2)+’_tr = transpose(c’+strtrim(string(i),2)+’,[1,0])’
    print, cmd
    ret=execute(cmd)
    endfor

    restore 문에서 파일 이름이 문자열이므로 따옴표 사용하셔야 하고, i가 알아서 문자열로 변환되지 않습니다. 아래쪽에서 사용하신 것처럼 string 함수로 변환 하셔야 합니다. 이것은 파일 이름과 관련한 문제이므로, 문자열 처리로 하는 것이 맞습니다.

    IDL 문장을 문자열로 만들어서 이를 실제 실행하는 것은 execute 함수가 하는 일인데, 위와 같이 사용합니다. 필요할 때가 있긴 하지만, execute를 사용하는 것은 처리 속도도 느리고, 일 복잡해 집니다. 배열을 이용해 작업 방향을 전환하시기를 권장합니다.

    Jonghyuk
    회원

    m_angle이 의미하는 것은 모르겠으나, 위 식에서 exp(-98) 이 되면 사실상 0에 가까운 수가 나올 수밖에 없는 구조라고 생각됩니다. 실제로 이런 계산을 필요로 하시는 것인지요?
    일단
    angle=0D
    m_angle=7D

    와 같이 double precision으로 데이터를 선언하시면 경고 메시지는 나오지 않고 더 정밀한 계산을 수행합니다만 대세에 영향을 줄 것 같지는 않습니다.

    답변: idl_idlBridge #924
    Jonghyuk
    회원

    저는 처음 보는 에러 메시지인데, Polaris Cluster 시스템에서 이와 같이 쓰레드 분기를 하는 것 자체를 막은 것 아닐까요? 다른 컴퓨터에서 잘 작동한다고 하셨듯이, 위 한 줄은 전혀 문제될 여지가 없는 내용이어서, 저도 막막합니다.
    oBridge=OBJ_NEW(‘IDL_IDLBridge’, OUTPUT=’/home/myhome/bridge_log.txt’)
    와 같이 로그 출력을 해 보시면 뭔가 힌트가 나오지 않을까 기대해 봅니다.

    답변: 불규칙한 시간 평균하는 법 #910
    Jonghyuk
    회원

    data=fltarr(1440)
    으로 데이터 정리할 공간을 만들고,
    hh, mm, ss로 컬럼을 분리한뒤
    minute=hh*60+mm
    과 같이 초를 무시해 버리면, minute은 0~1439 의 값을 가지게 될 것입니다.(같은 minute을 가지는 데이터들이 많겠죠).
    for i=0, 1439 do begin
    this_minute=where(minute eq i)
    data[i]=mean(value[this_minute])
    endfor

    이렇게 처리하시면 될 것 같습니다.
    위에서 value라는 것은 원시 자료의 데이터 컬럼을 의미합니다.

    해당 분에 데이터가 하나도 없는 경우는 없겠지요?

    눈금값과 관련하여서는 아래 글을 한번 검토해 보십시오.
    http://www.idl-envi.co.kr/callcenter/tips/view.php?num=34&page=2

    그런데, 개인적으로는 차라리 XYOUTS 같은 것을 이용해서 좀 쉽게 가는 쪽을 선호합니다.

    답변: 불규칙한 시간 평균하는 법 #911
    Jonghyuk
    회원

    data=fltarr(1440)
    으로 데이터 정리할 공간을 만들고,
    hh, mm, ss로 컬럼을 분리한뒤
    minute=hh*60+mm
    과 같이 초를 무시해 버리면, minute은 0~1439 의 값을 가지게 될 것입니다.(같은 minute을 가지는 데이터들이 많겠죠).
    for i=0, 1439 do begin
    this_minute=where(minute eq i)
    data[i]=mean(value[this_minute])
    endfor

    이렇게 처리하시면 될 것 같습니다.
    위에서 value라는 것은 원시 자료의 데이터 컬럼을 의미합니다.

    해당 분에 데이터가 하나도 없는 경우는 없겠지요?

    눈금값과 관련하여서는 아래 글을 한번 검토해 보십시오.
    http://www.idl-envi.co.kr/callcenter/tips/view.php?num=34&page=2

    그런데, 개인적으로는 차라리 XYOUTS 같은 것을 이용해서 좀 쉽게 가는 쪽을 선호합니다.

    답변: tm 좌표 값들을 #900
    Jonghyuk
    회원

    그 X, Y 점을 그대로 찍는 것이 목적이라면(X, Y 자체가 예를 들어 해안선 좌표 같은 거라면), 변환할 필요는 없을 것 같습니다. 텍스트 파일에 들어 있는 데이터가 어떤 것인지는 잘 모르겠지만, IDL의 기본 지도 좌표는 위경도 좌표이므로, 위도와 경도로 변환하면 IDL의 다른 지도 루틴들과 잘 어울릴 수 있을 것 같습니다.

    답변: 비공개: 바이너리파일 질문! #899
    Jonghyuk
    회원

    바이너리 파일은 원하는 부분만 읽을 수 있고 파일의 앞 뒤로 자유롭게 다니며 읽을 수 있습니다.
    앞의 질문에 대한 답글을 올렸습니다. 검토해 보세요.

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