for 반복문 내의 여러 변수 저장

게시판 IDL Q&A for 반복문 내의 여러 변수 저장

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #5654 Reply
      세진 임
      회원

      안녕하세요 IDL을 막 사용하기 시작한 초보 대학원생입니다.
      블로그와 IDL user group에서 많은 정보를 얻으며 공부하고 있어 유저분들께 너무 감사합니다.

      질문은 변수저장에 관한 간단한 질문이지만 초보라 막혀 헤메고 있습니다.

      190910_1.tif
      190910_2.tif
      190910_3.tif

      와 같은 파일을 가지고 있고 readtiffstack.pro이라는 tif 파일을 읽어 3차원 변수로 저장하는 프로시져가 있다고 할때
      a1=readtiffstack(‘190910_1.tif’)
      a2=readtiffstack(‘190910_2.tif’)
      a3=readtiffstack(‘190910_3.tif’)

      이런 식으로 변수 a1, a2, … a40 까지 변수공간에 저장을 하고 싶습니다.

      PRO test
      FOR i=1,40 DO BEGIN
      IF (i ge 10) THEN BEGIN
      rtf=’a’+STRING(i,format='(I2)’)+’=readtiffstack(”190910_’+STRING(i,format='(I2)’)+’.tif”)’
      result=execute(rtf)
      ENDIF ELSE BEGIN
      rtf=’a’+STRING(i,format='(I1)’)+’=readtiffstack(”190910_’+STRING(i,format='(I1)’)+’.tif”)’
      result=execute(rtf)
      ENDELSE
      ENDFOR
      END

      지금 짜논 프로시져가 컴파일은 되는데 변수가 생성이 안됩니다. 이유가 뭘까요?

    • #5655 Reply
      ChoiYoun
      회원

      프로그램에서 별다른 문제는 보이지 않습니다. 실행했을 때 출력되는 오류 메세지는 없을까요.

      ps. rtf 변수를 아래와 같이 수정하면 IF문이 필요없습니다.
      rtf=’a’+STRING(i,format='(I0)’)+’=readtiffstack(“190910_’+STRING(i,format='(I0)’)+’+tif”)’

      • #5656 Reply
        세진 임
        회원

        네 컴파일 되고 실행하면 loaded DLM: TIFF 뜨고 변수공간에는 아무것도 안생깁니다.
        IF문 수정은 감사합니다!!

    • #5657 Reply
      Sangwoo
      회원

      일단 readtiffstack이라는 기능은 IDL에서 기본적으로 제공되지 않습니다. 해당 파일명이 readtiffstack.pro인 것으로 봐선 아마도 외부에서 가져와서 사용중이신 IDL 프로그램인 것으로 보입니다. 제 어림 짐작으로는 아마도 TIFF 파일을 읽는 기능을 수행하는 IDL 내장함수인 READ_TIFF를 내부적으로 사용하고 있지 않을까 추측은 됩니다. 어쨌든 원래 하셨던 것처럼 EXECUTE를 사용하지 않고, 다음과 같이 그냥 일반적인 방식으로 사용했을 경우에도 작업이 정상적으로 수행되는지를 먼저 확인해보는 것이 좋을 것 같습니다.

      a1=readtiffstack(‘190910_1.tif’)

      언급하신 것과 같은 에러 메시지는 읽고자 하는 파일을 제대로 찾지 못했을 때 주로 발생합니다. 예를 들어 TIFF 파일을 읽는 기능을 수행하는 IDL 내장 루틴인 READ_TIFF 함수를 사용하는 상황에서, 만약 읽고자 하는 파일을 제대로 찾지 못했을 경우 다음과 같은 에러가 발생합니다. 여기서는 ‘my_tif.tiff’라는 파일이 실제로는 존재하지 않는 상태에서 실행하였습니다.

      IDL> img = read_tiff(‘my_tif.tiff’)
      % Loaded DLM: TIFF.
      % READ_TIFF: my_tif.tiff: Cannot open

      따라서 혹시라도 이와 비슷한 에러가 발생했을 경우라고 한다면, 읽고자 하는 TIFF 파일들을 프로그램이 혹시 제대로 못찾는 상황인지 여부를 먼저 확인해보시길 권장합니다.

      • 이 답변은 Sangwoo에 의해 4 years, 5 months 전에 수정됐습니다.
      • #5659 Reply
        세진 임
        회원

        일단 답변 감사합니다. 말씀하신 대로 READ_TIFF 함수가 내장이 되어있습니다.

        하지만
        IDL> a1=readtiffstack(‘190910_1.tif’) 로 해도 실행이 잘 되고

        IDL> rtf=’a’+STRING(1,format='(I1)’)+’=readtiffstack(”190910_’+STRING(1,format='(I1)’)+’.tif”)’
        IDL> result=execute(rtf)

        위와 같이 반복문에 들어가는 함수로 직접 i=1을 대입하고 해 봐도 BYTE[1280,960,1779] 형식의 변수 a1이 잘 생성됩니다.

        위의 유저분께서 말씀해주신 대로 I0 연산자로 바꾸고 내장되어 있는 READ_TIFF 함수를 써봐도

        PRO test
        FOR i=1,2 DO BEGIN
        rtf=’a’+STRING(i,format='(I0)’)+’=read_tiff(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
        result=execute(rtf)
        ENDFOR
        END

        컴파일되고 실행은 잘 되고 오류도 안뜹니다. 하지만 변수가 생성이 되지 않고 종료됩니다. tif 파일은 분명 설정 디렉토리 내에 존재합니다.
        while문으로 바꾸어 실행해보는게 도움이 될까요?

    • #5660 Reply
      ChoiYoun
      회원

      질문자님 답변으로 미루어보았을 때 제작한 프로그램이 정상적으로 작동하고 “종료”되어 변수공간에 아무 변수도 남지 않는 것이 아닐까란 생각을 해보았습니다.

      프로그램에서 생산한 변수를 확인하기 위해서는 프로그램이 종료되기 전에 멈추는 과정이 필요합니다. 아래와 같이 코드를 변경하고 실행한 후 변수공간을 확인해보시면 변수가 생성되어있을 것 같습니다.

      PRO test
      FOR i=1,40 DO BEGIN
      rtf=’a’+STRING(i,format='(I0)’)+’=readtiffstack(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
      result=execute(rtf)
      ENDFOR
      STOP
      END

      • 이 답변은 ChoiYoun에 의해 4 years, 5 months 전에 수정됐습니다.
      • #5666 Reply
        세진 임
        회원

        말씀해주신 방법도 변수가 생성되는 것을 보았지만 정상적으로 종료하면 다시 사라져서 제목을 주석처리하는 방식으로 하기로 결정했습니다.

        별거아닌 질문에 친절하게 답해주셔서 너무 감사합니다.

    • #5662 Reply
      Sangwoo
      회원

      그러면 처음에 언급하셨던 loaded DLM: TIFF 에러는 이제는 더 이상 발생하지 않는건가요? 그렇다면 별 문제 없이 작업이 진행되고 a1, a2와 같은 항목들이 생성되는 것이 정상입니다. 다음과 같이 HELP 명령을 사용하여 이들의 존재를 확인해볼 수 있습니다.

      PRO test
      FOR i=1,2 DO BEGIN
      rtf=’a’+STRING(i,format='(I0)’)+’=read_tiff(”190910_’+STRING(i,format='(I0)’)+’.tif”)’
      result=execute(rtf)
      ENDFOR
      HELP, a1, a2
      END

      이렇게 HELP 명령을 삽입한 상태로 프로그램을 실행했을 때 a1, a2에 관한 정보가 출력되는지 확인해보시기 바랍니다. 만약 a1, a2 항목에 대한 정보(배열 구조 및 배열 내 값들의 자료형)가 제대로 출력된다면 프로그램이 정상적으로 작동하는 것입니다. 다만 한가지 덧붙인다면 위와 같은 프로그램에서 생성되는 a1, a2 등의 항목들이 존재하는 영역은 프로그램의 메모리 영역입니다. 이 영역은 IDL 인터페이스의 변수감시창에서 나타나는 메모리 영역과는 완전히 별개입니다. 처음 질문하실 때 “변수공간”이라는 용어를 사용하셨는데 혹시나 IDL 인터페이스의 변수감시창을 뜻하고자 하셨던 것은 아니었는지 궁금합니다.

      • #5663 Reply
        세진 임
        회원

        네 loaded DLM: TIFF 에러는 발생하지 않습니다.

        말씀해주신 대로 HELP문을 넣어봤더니 a1, a2 정보가 정상적으로 잘 출력됩니다. 제가 메모리 영역과 변수감시창 영역이 별개라는 개념을 몰랐던 것 같습니다. 변수공간이라고 했는데 변수감시창을 뜻하는 것이 맞습니다.

        프로그램이 잘 실행되고 메모리 영역에 a1, a2가 존재하는 것을 HELP를 통해서 확인했는데 이 a1, a2를 변수감시창에 저장하고 싶습니다. 혹시 어떤 방법이 있을까요?

      • #5664 Reply
        Sangwoo
        회원

        말씀하신 “변수감시창에 저장한다”는 것은 a1, a2와 같은 항목들이 “변수감시창에서도 보이도록 한다”는 것과 마찬가지 의미입니다. 그런데 이미 말씀드린 것처럼, 프로그램 영역의 메모리와 변수감시창 영역의 메모리는 서로 별개입니다. 만약 두 영역이 서로 만나게끔 하려면 두가지 정도의 방법이 있습니다. 첫번째 방법은 위에서 ChoiYoun님께서 올리신 댓글에서 언급된 바와 같이 프로그램 내에 STOP 명령을 넣어주고 실행하는 것입니다. 그러면 프로그램이 실행되다가 STOP 명령 부분에서 중단되고, 이 때 프로그램 영역의 항목들이 변수감시창 영역에서도 보이게 됩니다. 두번째 방법은 프로그램의 제목 부분을 비활성화시킨 채 실행하는 것입니다. 제가 이전 댓글에서 적어놓았던 코드의 내용을 다음과 같이 수정하여 실행하는 방법입니다.

        ;PRO test
        FOR i=1,2 DO BEGIN
        rtf=’a’+STRING(i,format='(I0)’)+’=read_tiff(“190910_’+STRING(i,format='(I0)’)+’.tif”)’
        result=execute(rtf)
        ENDFOR
        HELP, a1, a2
        END

        물론 이 내용이 담긴 코드 파일은 여전히 test.pro가 되겠지만, PRO로 시작되는 제목 부분을 이와 같이 주석처리한 상태로 실행하면, 프로그램 내에서 생성되는 a1, a2와 같은 항목들이 변수감시창 영역에서 바로 나타나게 됩니다.

      • #5665 Reply
        세진 임
        회원

        마지막에 말씀해주신 대로 제목 부분을 주석처리하여 사용하는 것이 가장 좋을 것 같습니다.

        친절하게 설명해주신 덕분에 변수감시창에 대한 이해가 많이 되었고 연구진행이 될 것 같습니다.

        너무 감사합니다.

      • #5667 Reply
        Sangwoo
        회원

        한가지 첨언을 좀 드리자면, 제가 알려드린 두가지 방법들은 프로그램의 내용을 수정하고 디버깅하는 목적으로만 사용하고, 최종적으로 완성된 프로그램은 결국은 PRO~~END로 둘러싸인 형태가 되도록 하는 것이 좋습니다. 그렇게 하지 않으면 메모리 영역이 서로 겹치면서 예기치않은 문제가 발생할 수도 있기 때문입니다. 프로그램은 오직 프로그램 자체의 독자적인 메모리 영역에서 돌아가게끔 하는 것이 가장 좋습니다.

4 답변 글타래를 보이고 있습니다
'for 반복문 내의 여러 변수 저장'에 답변달기
글쓴이 정보:




취소