Kyecw

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

5 글 보임 - 1 에서 5 까지 (총 5 중에서)
  • 글쓴이
  • 답변: N_ELEMENTS함수 오류? #5382
    Kyecw
    회원

    WHERE 함수의 경우 기본 옵션으로 사용시, 조건에 맞는 요소가 없는 경우 결과로 -1을 돌려주게됩니다.
    그로인해 N_ELEMENTS 함수가 -1을 세어 결과로 1을 돌려주게 된 상황으로 보입니다.

    만약 조건에 맞는 값을 갖는 요소의 수를 세고 싶으시다면, 사용하신 것처럼 N_ELEMENTS를 이용하여 WHERE함수의 결과물 갯수를 직접 세시는 것 보다는 WHERE 함수에 탑재되어있는 COUNT 기능을 사용하시는 것이 더 편할 것입니다.

    Result = WHERE(조건, count)
    위의 예시처럼 WHERE 함수를 사용하실때 COUNT 인자에 해당하는 변수명을 입력해주시면 해당 변수로 조건에 맞는 원소의 갯수를 돌려받으실 수 있으실 겁니다.

    답변: readf 데이터읽기.. #5349
    Kyecw
    회원

    readcol 프로시져에서 delimiter 및 포맷을 지정해 줬다면 굳이 포맷에 공백을 명시해줄 필요는 없습니다.
    자료 컬럼이 총 3개이므로 FMT = ‘(A, F, F, F)’면 충분할 것 같습니다.

    또는 제시해주신 자료가 csv형식으로 되어있으므로 read_csv 함수를 사용하시는 것도 괜찮습니다.
    read_csv의 사용법은 IDL 도움말을 참조하시면 도움이 되실겁니다.

    답변: readf 데이터읽기.. #5347
    Kyecw
    회원

    기본적으로 readcol 프로시져는 아무런 설정 없이 사용할 경우, 읽는 자료를 float, 구분자(delimiter)를 공백으로 인식하여 자료를 읽게 설정되어있습니다.
    헌데 말씀해주신 일:월:년의 형식으로 날짜값이 자료안에 끼어들어가 있을 경우, 해당 날짜값이 작성된 컬럼에는 float 형식으로 읽을 수 있는 실수값이 작성되어있지 않으므로 readcol 프로시져가 해당 라인을 헤더 또는 잘못된 값이 저장된 라인으로 인식하여 건너뛰게 됩니다.

    따라서 자료를 읽고싶으시다면 해당 날짜값이 작성된 순번의 컬럼을 읽는 자료 형식을 string으로 지정해주거나 delimiter를 지정해주는 방법을 사용하셔아합니다.

    만약 읽으시려는 자료의 구성이 일:월:년로만 되어있어서 년, 월, 일을 다른 변수로 읽고 싶은 상황이라면 readcol 구문에 delimiter = ‘:’를 추가해주시는 것으로 해결할 수 있습니다.

    또는 자료의 구성이 년:월:일로 구성된 날짜값이 들어있고, 다른 값들이 실수로 저장되어있는 경우, format 옵션을 이용하여 날짜값이 들어있는 컬럼의 자료 형식을 string을 의미하는 A로, 다른 자료들이 들어있는 컬럼의 자료 형식을 float를 의미하는 F로 지정하시면 됩니다.

    답변: 에러 원인 #5344
    Kyecw
    회원

    해당 에러는 IDL에서 배열을 생성할 때 배열을 구성할 크기를 0이하로 지정해주었을 경우 발생하는 에러입니다.

    예를 들어 A라는 배열을 생성하기 위해서
    A = FLTARR(0)
    이라는 명령어를 입력하게 되면 질문해주신 에러와 동일한 에러가 발생하는 것을 확인할 수 있습니다.

    따라서 질문해주신 에러는 코드 내의 배열 생성 부분에서 발생한 것으로 추측되는데,
    좀더 정확한 상황 파악을 위해 배열 생성 부분 근처의 소스코드를 붙여주신다면 좀더 정확한 원인을 진단할 수 있을 것입니다.

    • 이 답변은 Kyecw에 의해 5 years, 9 months 전에 수정됐습니다.
    답변: 배열 요소별 평균에 관한 질문 #5086
    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)로 나눠주시면 원하시는 각 요소별 평균을 구할 수 있을 것입니다.

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