Jonghyuk Yi

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

10 글 보임 - 1 에서 10 까지 (총 10 중에서)
  • 글쓴이
  • 답변: mpfit 함수를 이용한 회귀분석 #5094
    Jonghyuk Yi
    회원

    되다가 안되다가 한다는 설명을 정확히 진단하기는 어렵습니다만, 경로 설정 문제로 생각됩니다.

    MPFIT 관련 라이브러리들을 모두 한 폴더에 풀어 놓고,

    IDL Workbench 메뉴에서 창(W) > 환경설정을 실행하면 환경설정 창이 열립니다.
    왼쪽 목록에서 IDL 항목을 펼치면 경로 라는 메뉴가 나옵니다. 이를 설정하고,
    아래에 추가 버튼을 이용해서
    MPFIT을 풀어놓은 폴더를 지정하세요.

    이후 적용버튼 누르고 확인 으로 나오면 될 것 같습니다.
    이 것의 의미는 이 설정 이후에 IDL은 함수나 프로시저 호출이 나오면 추가한 폴더에 해당 이름을 가진 프로시저나 함수가 있는지 확인하는 것입니다.

    문제는 현재로도 어떤 때는 된다는 것인데, 중복되는 루틴이 경로상에 있는 것은 별로 좋지는 않습니다. 중복하여 존재하지 않게 하나는 정리하시는 게 좋겠습니다. 아마도 어떤 작업 과정 중에 명시적으로 MPFIT 루틴들을 컴파일 하는 계기가 있을 것이고 이 이후에는 실행이 되다가, 세션 리셋이 되면 다시 실행이 안되는 그런 상황인 것 같습니다.

    pi[0].fixed=1
    pi[0].value=0.

    은 적절한 사용이라고 생각됩니다.

    저는 올려주신 코드 그대로 talh와 talc만 모의로 데이터를 만들어 실행했을 때 실행이 잘 됩니다. (컬러 체계는 저와 좀 다른 듯 하여 그 부분은 수정하였습니다).

    syntax error라고 나오는 이유는,
    저 프로그램을 돌릴 때, mpfitexpr 함수를 찾을 수 없음 -> 그러므로 mpfitexpr을 배열이라고 생각하고 배열식 접근을 시도 -> 그러나 배열의 인덱싱 체계에 맞지 않는 parinfo=pi 라는 구문이 나오므로, 문법 오류처리 하는 것입니다.

    이것이 과거의 문법을 그대로 계승하는 과정 중에 배열도 둥근괄호 ( ) 로, 함수도 둥근괄호 ( )로 접근할 수 있게 두다 보니 헷갈리게 되는 상황입니다.

    만일, 경로 설정이 안된 상태에서, 해당 프로그램의 서두에 compile_opt IDL2 또는 compile_opt strictarr 을 선언한다면. 같은 부분에서 syntax error 대신
    % Attempt to call undefined function: ‘MPFITEXPR’.
    이라는 에러를 발생합니다.
    compile_opt IDL2나 compile_opt strictarr은 배열은 사각괄호 [ ]만 허용, 함수는 둥근괄호 ( ) 만 허용하기 때문에, mpfitexpr을 처음부터 함수일 거라고 확정하고 문법적인 접근을 합니다. 그래서 “그런 함수 없어요”에 해당하는 에러를 바로 발생하게 됩니다.

    물론, 경로 설정만 제대로 된다면, 이런 문제는 없을 것입니다.

    이런 이유로 현대적인 IDL 프로그래밍 체계에서는 compile_opt IDL2를 강제 또는 강력히 권고함으로써 지금 겪으시는 혼선을 사전에 제거하려 노력하기도 합니다.

    아래 링크는 이에 대해 좀 더 자세히 설명하고 있습니다.
    http://blog.daum.net/swrush/146

    답변: 내삽과 관련된 함수 #5001
    Jonghyuk Yi
    회원

    MATLAB 게시판을 보니, INTERP2 함수를 다음과 같이 사용하는 것으로 나옵니다.

    Vq = interp2(X,Y,V,Xq,Yq)

    MATLAB을 잘 모르지만, 설명으로 보면, IDL에서 이런 일을 하는 함수는 GRIDDATA 가 아닌가 생각합니다. 위 Matlab 예제와 같은 변수명을 사용한다면,

    Vq = GRIDDATA(X, Y, V, XOUT=Xq, YOUT=Yq)

    의 형태로 사용할 수 있습니다. GRIDDATA에서 KRIGING 메쏘드를 쓸 수도 있는데, 언급하신 KRIG2D 함수를 사용한다면.

    Vq = KRIG2D(V, X, Y, XVALUES=Xq, YVALUES=Yq)

    이렇게 사용할 수 있습니다.

    Jonghyuk Yi
    회원

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

    이 링크에 나오는 get_position 함수를 사용하시면 해결될 것 같습니다.

    답변: ENVI 영상 픽셀 편집 #3253
    Jonghyuk Yi
    회원

    1024개의 밴드가 1 column 씩 왼쪽으로 이동되어 있는 상태라는 의미이신가요?
    이 경우 맨 왼쪽 컬럼으로 있어야 할 데이터가 맨 오른쪽으로 가 있는 상태인가요? 그렇지 않다면, 맨 뒷쪽 밴드와 맨 앞쪽 밴드는 공유하는 면적이 너무 좁을 것이라고 예상됩니다.

    근본적으로는 데이터가 왜 이렇게 생성되는지 파악하면 좋겠지만, 어쨌든 데이터가 어떻게 잘못 저장되어 있는지에대한 파악이라도 확실하다면, 말씀하신 대로 IDL에서 데이터 수정은 가능할 것 같습니다.
    이 기능을 ENVI에 넣는 것도 가능합니다. 이를 위해서는 일단 IDL 문법에 익숙할 필요는 있습니다.

    개발된 기능을 ENVI에 extension으로 넣는 것도 가능한데,
    https://www.harrisgeospatial.com/docs/ToolboxExtensions.html
    위 링크의 도움말을 보시면 일단 시작을 하실 수 있을 거라고 생각합니다.

    제 생각에는 사용자의 Interaction이 별로 필요하지 않은 데이터 수정 작업 (-1)*(1 column * Band번호) 만큼 이동시키는 거라면 – 밴드번호만큼 왼쪽으로 이동 – 그냥 IDL 프로그램을 만들어 데이터마다 수정하는 게 빠를 것 같기는 합니다. 굳이 ENVI Extension을 만들 필요는 없지 않나 생각합니다.

    Jonghyuk Yi
    회원

    IDL 내에서 배열을 이어 붙이는 방법을 이용하는 것이 확장성을 고려하면 안전합니다. 그런 면에서 위 mwkim 님의 답변이 가장 좋은 방법일 것 같습니다. 다만, 앞의 설명이 막막하게 느껴진다면, OS(운영체제)의 도움을 받는 방법도 있을 것 같습니다.

    윈도우라면, 명령 프롬프트를 열어서
    C:\경로> copy *.txt every.all

    Linux/Unix 계열이라면 터미널을 열어서
    경로$ cat *.txt > every.all

    위와 같은 방법으로 모든 파일을 하나로 일단 합쳐놓는 것입니다.

    이후 IDL에서 readcol, every.all, year, min, num ….
    을 실행하면 모든 데이터를 하나의 배열로 읽을 수 있습니다. readcol이 중간에 등장하는 헤더들을 알아서 건너 뛰기 때문에 이런 시도가 가능합니다. IDL에 익숙하지 않은데, 급하게 일을 처리해야 한다면, 이 방법을 추천합니다.

    spawn 명령을 이용하면, 운영체제에서의 작업을 IDL 코드 안으로 넣을 수도 있긴 합니다. 어렵진 않습니다.
    cd, ‘경로’
    spawn, ‘copy *.txt every.all’

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

    보여주신 위 코드의 틀에서 어색한 점은 없어 보입니다.
    20~30MB 정도는 요즘은 대용량이라고 보기는 어렵습니다. 그 문제는 아닌 듯 합니다.

    1) 프로그램을 실행 할 때마다 문제가 발생하는 파일이 달라진다는 말씀이신가요? 예를 들면, 어떤 실행에서는 3월 20일 파일이 비정상적으로 기록되고, 다음 실행에서는 3월 20일은 멀쩡한데, 6월 20일이 비정상적으로 저장되고, 그런다는 의미이신가요? 그렇다면 분명 이상한 상황이기는 합니다.

    2) 전체 상황을 잘 모르겠지만, close, 1 을 실행하지 못하면 쓰다 만 파일이 될 가능성이 매우 높습니다.
    그런데, 이 경우를 가정해도 다음 반복실행에서 openw, 1 을 실행하면 “이미 열려 있는 파일입니다” 라는 에러가 발생합니다. 혹시 close 대신, /GET_LUN, FREE_LUN을 쓰셨다면 이부분을 살펴보셔야 할 것 같습니다만 올려주신 코드에서는 close를 쓰셨기 때문에 이 문제라고 보기는 좀 어렵죠.
    그럼에도, “중간에 작성이 멈춘 것 같다” 라는 말씀은 close, 1을 실행하지 못할 때의 전형적인 상황이어서 일단 이 부분 아닐까 찍어 봅니다.

    조금 더 정보가 필요한 상황입니다.

    답변: call_external 질문 #3174
    Jonghyuk Yi
    회원

    CALL_EXTERNAL 함수로 DLL을 호출할 때 발생하는 IDL 종료 현상에 대해서는 원인을 찾는 것이 어렵지 않을까 생각합니다. IDL은 기본적으로 IDL이 사용하는 메모리 바깥쪽의 일에 대해서 깊이 조사하고 제어하는 기능이 없습니다. Error Message를 내는 그런 상황도 아니어서 원인 규명이 쉽지는 않을 것 같습니다.

    1) 말씀하신 SPAWN의 PIPE 기능을 이용하여 exe 프로그램과 데이터를 주고 받으며 진행하는 방법으로는 해결할 수 있다면 가장 안전한 방법이 될 것 같습니다.
    IDL 도움말에서 Using Spawn and Pipes 라는 글의 내용으로 해결될 수 있다면 좋겠습니다.
    “Spawn PIPE”로 검색하여 찾으실 수 있습니다.

    2) LAPACKE_dgeev 함수에 대해 알지 못하지만, IDL에도 LAPACK이 내장되어 있습니다. IDL 내장함수로 처리될 수 있다면 더 안전한 방법이 될 수 있을 것 같습니다. 다만, 말씀하신 함수와 기능이 같은지는 모르겠습니다.
    IDL 도움말에서 LAPACK으로 검색하여 찾으실 수 있습니다. IDL LAPACK 루틴들은 LA_ 로 시작합니다.

    답변: function 질문있습니다. #1628
    Jonghyuk Yi
    회원

    보여주신 3개의 문장 중, 첫번째 문장에 있는 hdf_sd_select() 함수는 IDL 함수로 IDL만 있으면 실행할 수 있습니다. sd_file 은 파일을 상징하는 번호이고, 0는 그 파일 안에서 SD 데이터셋 번호입니다. HDF 파일 안에는 여러개의 SD 데이터셋이 들어 있을 수 있습니다.
    아마도 sd_file 변수는 HDF_SD_START() 함수의 리턴값일 것입니다. 소스코드에서 약간 앞쪽 부분을 찾아 보세요.

    이후에 나오는 두 문장은 ENVI라는 영상처리 소프트웨어에서 지원하는 프로시저입니다. ENVI는 IDL로 만들어져서 IDL에서 기능 호출이 됩니다. 이를 ENVI API라고 하는데, ENVI가 설치되어 있는 IDL 환경에서 사용할 수 있습니다.

    envi_write_envi_file, ji, outname=aa, r_fid=bb
    과 같이 프로시저 형태로 사용되는 것이 맞을텐데요, ji 배열(일반적으로 영상입니다)을 aa라는 파일 이름으로 저장하라는 의미입니다. 프로시저 이름처럼, ENVI 표준 포맷으로 저장하고요, 저장된 이후 이 파일을 가리키기 위한 번호를 bb 변수로 받겠다는 의미입니다. (r_fid : Return File ID) bb 안에 어떤 숫자가 들어갈지는 프로그램이 실행될 때마다 다르지만 어쨌든 이 때 생성되는 파일을 가리킵니다.

    envi_file_query, aa, ns=n1, nl=n2, nb=n3
    과 같은 형태로 씌였을 것 같은데요, 프로시저 이름대로, ENVI 파일(보통 영상입니다, ENVI는 영상처리 플랫폼이니까요)의 속성을 알아내는 프로시저입니다. aa는 File ID입니다. 앞 문장의 r_fid 같은 것으로 받아내는 값이죠. 이후 ns= 이후에 나오는 변수에 # of Samples(가로크기), nl= 이후에 나오는 변수에 # of Lines(세로크기), nb= 이후 나오는 변수에 # of Bands (밴드 개수)를 받아냅니다.

    답변: 컴파일 후 실행할때 에러 #1627
    Jonghyuk Yi
    회원

    소스코드를 보지 않은 상태에서 상황을 이해하기는 어렵습니다만,
    첫 줄의 메시지는 file_name01 이라는 프로시저가 실행되는 중에 file_name01을 다시 컴파일 하라는 명령을 받아, 일단 돌리고 있던 file_name01은 중단하고(returning) 다시 컴파일한다는 의미인데요, 이 때 보통은
    바로 다음 줄이 file_name01을 컴파일 하였다는 내용이 될텐데, 그렇지 않은 것 같습니다. 이 부분은 제가 이해가 잘 가지 않습니다.

    경험적으로 보았을 때,
    file_name01 프로시저와 file_name02 프로시저 또는 펑션이 소스코드 상의 순서가 바뀌어 발생하는 문제 아닐까 생각합니다(두번째 실행시켰을 때는 실행된다는 것으로부터 추측합니다). 소스코드 상에서 이 두 블록의 위치를 바꾸어 보시면 어떨까 생각합니다.

    실행 코드라고 말씀하시는 것의 메인이 스크립트 형태가 아닐까 하는 생각도 듭니다. 일반 프로그램(컴파일 후 실행하는)에서는 .compile 명령을 쓸 수 없기 때문에, 실행 중 중단하고 다시 컴파일 하는 경우는 없거든요.

    Jonghyuk Yi
    회원

    N=7
    data=bytarr(N, N)
    data[0:*:2]=1
    print, data
    data=data*255

    sz=N*60
    img=rebin(data, sz, sz, /SAMPLE)
    window, xsize=sz, ysize=sz
    tv, img
    end

    일단 위 예제는 N이 홀수일 경우에만 정상적으로 보입니다.  프로그램 구조를 일단 단순화하는 것이 좋으므로 짝수일 경우는 배제하였습니다.

    위 예제에서 print로 출력되는 부분은 다음과 같습니다.

       1   0   1   0   1   0   1
       0   1   0   1   0   1   0
       1   0   1   0   1   0   1
       0   1   0   1   0   1   0
       1   0   1   0   1   0   1
       0   1   0   1   0   1   0
       1   0   1   0   1   0   1

    보이는 대로 일단 배열 자체를 체크 플래그로 만들고, 곱하기 255를 해서 흑색0과 백색255로 나누고 마지막으로 rebin을 통해 확대한 이미지로 변환하는 것이 이 예제의 흐름입니다.

    처음 올려주신 예제가 repeat를 사용하기 위한 연습이라면 제가 잘못 답변을 드린 것인데요, 처음 올려주신 예제처럼 하시면 X와 Y가 함께 증가하게 되므로 대각선 방향만 원하시는 대로 생성될 수밖에 없을 것 같습니다.

    아직 준비중인 사이트인데 첫 손님으로 오셨네요. 올리신 글이 어느날 없어지거나 할 수도 있는데요, 준비중이어서 그런 것이니 널리 양해 부탁드립니다. 일부러 지우거나 하는 그런 일은 없을 것입니다.

    예상치 못했지만, 환영합니다.

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