2011-08-01 3 views
0

경험상 Fortran 90에서 큰 배열을 출력 파일에 저장하는 가장 좋은 방법은 무엇입니까? 이전에는 큰 배열을 ASCII 텍스트 파일에 쓰려고했습니다. 예를 들어, 내가 (페이지 In Fortran 90, what is a good way to write an array to a text file, row-wise? 하단의 추천 덕분에) 이런 짓을 할 것이다 :이 작동Fortran 90 바이너리에 저장된 데이터를 사람이 읽을 수있는 형식으로 변환

PROGRAM testing1 
    IMPLICIT NONE 
    INTEGER :: i, j, k 
    INTEGER, DIMENSION(4,10) :: a 

    k=1 
    DO i=1,4 
    DO j=1,10 
     a(i,j)=k 
     k=k+1 
    END DO 
    END DO 

    OPEN(UNIT=12, FILE="output.txt", ACTION="WRITE", STATUS="REPLACE") 
    DO i=1,4 
    DO j=1,10 
     WRITE(12, "(i2,x)", ADVANCE="NO") a(i,j) 
    END DO 
    WRITE(12, *) 
    END DO 
    CLOSE(UNIT=12) 
END PROGRAM testing1 

하지만 In Fortran 90, what is a good way to write an array to a text file, row-wise?에서 맨 위의 답변에 의해 지적, 큰 배열을 작성하는 것은 텍스트 파일 매우 느리며 크기보다 약간 큰 파일을 만듭니다. 포스터 같은 것을 사용하는 대신 포맷되지 않은 포트란 바이너리에 쓰기가 추천 :이 작동하는 것 같다, 그리고 응답 here 약속으로, 실제로 훨씬 더 빠르고 작은 파일 크기 결과

PROGRAM testing2 
    IMPLICIT NONE 
    INTEGER :: i, j, k 
    INTEGER, DIMENSION(4,10) :: a 

    k=1 
    DO i=1,4 
    DO j=1,10 
     a(i,j)=k 
     k=k+1 
    END DO 
    END DO 

    OPEN(UNIT=13, FILE="output.dat", ACTION="WRITE", STATUS="REPLACE", & 
     FORM="UNFORMATTED") 
    WRITE(13) a 
    CLOSE(UNIT=13) 
END PROGRAM testing2 

. 그러나 나중에 Fortran 바이너리에 저장된 데이터 (예 : 위의 output.dat)로 작업하고 그 내용을 분석하려면 어떻게해야합니까? 예를 들어 Microsoft Excel과 같은 프로그램에서 이진 파일에 저장된 배열을 열려면 어떻게해야합니까?

내가 전에 post에서 matlab에 대해 언급했을 때, 그 답은 16 진수 파일로 이진 파일을 열어 거기에서 레코드를 추출했다고 제안했습니다. 그러나 나는 16 진수 술취에 대한 사전 경험이 없기 때문에 나는 깊은 물에 빠져들고있는 것이 불안하다. matlab 게시판 (여기 : http://www.mathworks.com/matlabcentral/answers/12639-advice-on-reading-an-unformatted-fortran-binary-file-into-matlab)에서 fortran 파일을 matlab으로 읽는 것에 대해 물어 보았을 때, 거기에있는 사람은 Fortran 스트림을 사용하는 것이 쉬울 것이라고 제안했습니다. 그러나 Fortran 스트림 (즉, OPEN 명령의 ACCESS="STREAM" 지시문 사용)은 시간과 파일 크기가 위의 첫 번째 예제에서 만든 ASCII 텍스트 파일과 비슷할 가능성이 있습니까?

또는 Fortran 바이너리를 사람이 읽을 수있는 형식으로 자동 읽을 수있는 다른 소프트웨어가 있는지 알고 있습니까? (아니면, 16 진수의 sleuthing이나 Fortran 스트림에 대한 좋은 튜토리얼을 알고 있습니까?)

시간 내 주셔서 대단히 감사합니다.

+1

특히 matlab에 정보를 얻으려고하십니까? 그렇다면 HDF5를 적극 권장합니다. 이것은 당신이 찾고있는 이식 가능한 이식 형식입니다. – matt

+0

감사합니다. 예, matlab에 정보를 얻는 것은 괜찮습니다. 실제로 사람이 읽을 수있는 형식은 훌륭합니다. HDF5를 시작하고 배우는 방법, 특히 Fortran 90에서 이러한 파일을 작성하는 방법 또는 Fortran 바이너리를 HDF5로 변환하는 방법에 대한 제안이 있습니까? – Andrew

+1

당신은 ACCESS = 'DIRECT'를 사용하여 1 레코드를 사용하고 레코드 길이를 배열의 크기로 설정하여 레코드 마커를 피할 수 있습니다. 이렇게하면 파일에 데이터 만 저장되며 그 후에 Matlab에서 이진 파일로 읽을 수 있습니다. – steabert

답변

2

스트림은 포맷 된/포맷되지 않은 선택과 상관없이 선택합니다. 하나는 "액세스"이고 다른 하나는 "포맷"입니다. 포트란 I/O의 기본값은 레코드 지향 액세스입니다. 각 레코드의 앞뒤에 4 바이트 레코드 길이를 기록하는 레코드 용 (적어도 포맷되지 않은) 포트란 컴파일러의 일반적인 접근법. ("후"는 뒤로 읽기 쉽게하기위한 것입니다.) 16 진수 편집을 사용하여 설명 된 이러한 추가 데이터 항목을 검증하고 MatLab에서이를 건너 뛸 수 있습니다. 그러나 그들은 언어 표준의 일부가 아니며 이식성이 없으며 다른 언어에서도 확실하지 않습니다.스트림을 선택하고 서식이 지정되지 않은 경우 데이터 항목에 해당하는 원시 바이트 시퀀스 만 가져옵니다. 다른 언어에서는 걱정할 추가 데이터 항목이 없습니다! 내 경험상이 출력은 다른 언어 (MatLab에서 시도하지 않음)에서 읽기가 쉽습니다. 이 파일이 다른 컴퓨터에 이식성이없는 간단한 & 프로젝트라면 HDF5 나 FITS와 같은 파일 형식 사양이 아닌이 방법 (형식은 &)을 사용하는 것이 좋습니다. 마지막 예제에서와 같이 배열을 write (13)로 씁니다. 다른 언어에 따라 치수를 조 변경해야 할 수도 있습니다. 이것이 이식성이있는 중요하고 수명이 긴 프로젝트 인 경우, 이식 가능한 표준 파일 인터페이스를 고려해 볼 가치가 있습니다.

Excel에서 이러한 형식을 읽을 수 있는지 여부를 알 수 없습니다. 더 많은 연구 .... 어떤 형식의 이진 파일을 읽고 Excel이 이해하는 형식으로 파일을 출력하는 프로그램을 작성해야 할 수도 있습니다.

2

가 특별히 matlab에로 정보를 얻을 수하려고 (후손에 대한 답변에 코멘트를 변환)? 그렇다면 HDF5을 적극 권장합니다. 이것은 당신이 찾고있는 이식 가능한 이식 형식입니다.

Fortran 바이너리를 HDF5로 변환하려면 원래의 Fortran 바이너리를 읽고 HDF5 파일에 동일한 데이터를 써야합니다. 포트란 소스를 가지고 있다면, 이것은 꽤 쉬울 것입니다. 배열을 할당하고, 쓴 순서와 동일한 순서로 배열을 읽은 다음 새 반짝이는 HDF5 파일을 작성하십시오.

HDF5 그룹은 C 및 포트란에 예제가있는 tutorials입니다. 당신이하려는 일에 아주 가까운 예가있을 것입니다. HDF5를 빌드 할 때 Fortran 지원을 수동으로 활성화하십시오. 기본적으로 사용하지 않도록 설정되어 있습니다.

1
%In MATLAB 

fid=fopen('YOUR_FILE.direct','r'); %Fortran Direct ACCESS 
frewind(fid); 

tbb=ones(367,45203); 

    for i =1:367 
      temp=fread(fid,[45203],'single'); 
      tbb(i,:)=temp; 
    end 

fclose(fid) 
관련 문제