배열 요소별 평균에 관한 질문

게시판 IDL Q&A 배열 요소별 평균에 관한 질문

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #5085 Reply
      kmk
      회원

      안녕하세요? 이리저리 궁리하다 답이 안나와 글 올려 봅니다.

      배열에서 요소별 평균을 구하고 싶습니다.
      여러개 파일일때 어떻게 해야 할지를 모르겠습니다.
      [1]번처럼 하면 파일이 100개 정도로 늘어나면 넘 힘들어져서,,
      [2]번처럼 하려니,,, 계산이 이상합니다. ㅠㅠ

      [1]
      openr, 11,’C:\Users\user\Desktop\a01.dat’
      openr, 12,’C:\Users\user\Desktop\a02.dat’
      openr, 13,’C:\Users\user\Desktop\a03.dat’

      data1=dblarr(3,5)
      data2=dblarr(3,5)
      data3=dblarr(3,5)

      readf, 11 , data1
      readf, 12 , data2
      readf, 13 , data3
      dataa= data1 + data2 + data3
      dataaa = dataa/3
      close, 11, 12, 13

      [2]
      file=file_search(‘C:\Users\user\Desktop\a0*.dat’)
      for i=0,2 do begin
      file_input=file[i]
      openr, 7, file[i]
      file_input=dblarr(3,5)
      readf, 7, file[i]
      dataa=dblarr(3,5)
      dataa= total(file_input)

    • #5086 Reply
      Kyecw
      회원

      안녕하세요.

      [2]번에 적어주신 코드에 대해서 몇가지 생각을 좀 해보았습니다.

      우선 파일 입력과정에서 file_search를 이용해 데이터 파일을 찾으실 때, 찾는 파일을 a0*.dat로 입력하시면, a10.dat 같은 케이스는 찾을 수 없게되니 a*.dat로 입력하는 것이 좋을 것 같습니다.

      보여주신 코드를 확인해 봤을 때, file이라고 하는 배열에 파일의 이름들이 들어가고, file_input이라고 하는 2차원 배열에 각 파일들의 데이터가 입력되는 것으로 보이므로 그렇게 생각하고 설명을 드리겠습니다.

      코드의 구조를 살펴보면, 원하시는건 a*.dat의 데이터들을 file_input 배열에 읽어들여서, dataa라는 배열에 모든 데이터를 합쳐서 총합을 구한뒤, dataa를 파일 갯수로 나눠 평균을 구하는 것으로 추측됩니다.
      그렇다면 반복문 안에 ‘dataa=dblarr(3,5)’가 있으면, 반복문이 수행되는 동안 새로운 파일을 읽을 때마다 dataa를 초기화하여 앞서 읽은 데이터가 지워지게되므로, 반복문 밖으로 ‘dataa=dblarr(3,5)’ 구문을 꺼내줄 필요가 있습니다.

      그리고 for 구문을 시작하실 때 ‘for i=0, 2’로 시작하셨으니 a03.dat까지의 파일만 읽어들이게 됩니다.
      하지만 [1]번 케이스에서 파일이 늘어난다는 언급을 하신 것으로 보아, 데이터 파일의 갯수는 유동적인 것으로 보입니다.
      따라서 그때그때 반복문 수행 부분을 수정하지않기 위해서 배열의 요소 갯수를 세어주는 n_elements 함수를 이용하여 ‘for i=0, n_elements(file)-1 do begin’으로 시작하셔서 변하는 데이터 파일의 갯수에 맞춰 반복문을 수행할 수 있게 하는 것이 편할 것입니다.

      그 아랫줄에 file_input = file[i]는 파일의 데이터를 입력받기 위한 file_input에 파일의 이름인 file배열의 값을 받을 이유가 없으므로 지우시면 될 것 같습니다.

      readf 프로시져는 지정한 채널에 해당되는 파일의 데이터를 지정한 변수로 읽어들이는 역할을 하므로, 여기선 파일의 데이터를 읽어들이는 용도로 선언한 file_input 배열에 데이터를 읽어들이기 위해서 ‘readf,7,file[i]’ 부분은 ‘readf, 7, file_input’으로 수정하시면 됩니다.

      그리고 total 함수는 주어진 배열의 모든 원소의 총합값을 구해주는 역할을 하므로 현재 목적엔 적합한 함수가 아닙니다.
      따라서 ‘dataa=total(file_input)’부분은 읽어들인 a*.dat의 데이터를 모두 합치기 위해 ‘dataa = dataa + file_input’으로 수정해야할 것입니다.

      마지막으로, openw나 openr을 이용해 파일을 열었으면 close를 이용해 파일을 닫아주셔야하고, 반복문의 끝부분에 endfor를 추가하시면 됩니다.

      위와 같이 수정하신 뒤에 dataa를 파일의 총 갯수인 n_elements(file)로 나눠주시면 원하시는 각 요소별 평균을 구할 수 있을 것입니다.

1 답변 글타래를 보이고 있습니다
'배열 요소별 평균에 관한 질문'에 답변달기
글쓴이 정보: