2011-08-01 8 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?の下部の勧告に感謝)のような何かをするだろう非常に遅く、必要以上にサイズが大きいファイルを作成します。ポスターのようなものを使用して、代わりにフォーマットされていないFortranのバイナリへの書き込みが推奨:これは動作しているようです、と返事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ストリームの使用が簡単かもしれないと示唆しました。しかし、上記の最初の例で作成したASCIIテキストファイルとFortranストリーム(つまり、OPENコマンドのACCESS="STREAM"ディレクティブを使用している可能性があります)が時間とファイルサイズが類似している可能性がありますか?

また、Fortranバイナリを人間が読める形式に自動的に読み込むことができる他のソフトウェアがあるかどうか知っていますか? (または、16進数の浮遊またはFortranストリームのいずれかの良いチュートリアルについて知っていますか?

ありがとうございます。

+1

具体的に情報をmatlabに取得しようとしていますか?あなたがいるなら、私はHDF5を強く勧めます。これはあなたが探していたポータブルバイナリフォーマットです。 – matt

+0

ありがとう!はい、情報をmatlabに入れても問題ありません。実際に人間が判読できる形式はすばらしいでしょう。 HDF5の使い方、特にFortran 90からそのようなファイルを書く方法や、FortranバイナリをHDF5に変換する方法についてのアドバイスはありますか? – Andrew

+1

ACCESS = 'DIRECT'を使用して1レコードを使用し、レコード長を配列のサイズに設定することで、レコードマーカーを避けることができます。これにより、ファイル内のデータだけが得られます。その後、バイナリファイルとしてMatlabで読み取ることができます。 – steabert

答えて

2

ストリームは、フォーマット/非フォーマットの選択に依存しない選択です - 一方は「アクセス」、他方は「フォーマット」Fortran I/Oのデフォルトはレコード指向のアクセスです。各レコードの前後に4バイトのレコード長を書き込むための、レコード用のFortranコンパイラの典型的なアプローチ(少なくともフォーマットされていない)。 (「後」は後ろ向きに読みやすくするためです)。ヘキサ編集を使用すると、記述した余分なデータ項目を確認し、MatLabでスキップすることができます。しかし、それらは言語標準の一部ではなく、移植性がなく、他の言語では明らかではありません。ストリームを選択してフォーマットされていない場合は、データ項目に対応する生のシーケンスのバイトが取得されます。他の言語では心配する余分なデータ項目はありません。私の経験では、この出力は他の言語(MatLabでは試していません)で読みやすくなっています。これが問題ではない他のコンピュータへのファイルの移植性を持つ簡単な&プロジェクトであれば、私はHDF5やFITSなどのファイル形式仕様ではなく、この方法(フォーマットが未定義のストリーム&)を使用します。最後の例のように、配列をwrite(13)aと書くことにします。他の言語に応じて、寸法を転置する必要があります。これが移植性を重視した長寿命のプロジェクトであれば、ポータブルで標準的なファイルインタフェースを検討する価値があります。

Excelからこれらの形式を読み取ることができるかどうかわかりません。さらなる研究....どの形式のバイナリファイルを読み込んで、Excelが理解できる形式でファイルを出力するためのプログラムを書く必要があります。

2

(後世のための答えにコメントを変換)

あなたは、具体的MATLABに情報を取得しようとしていますか?もしあなたなら、私は非常にHDF5をお勧めします。これはあなたが探していたポータブルバイナリフォーマットです。

FortranバイナリをHDF5に変換するには、元のFortranバイナリを読み込み、同じデータをHDF5ファイルに書き出す必要があります。 Fortranのソースをお持ちの場合は、これはかなり簡単です。あなたの配列を割り当て、あなたがそれらを書いたのと同じ順序で配列を読んだことを確認して、新しい光沢のあるHDF5ファイルを書き出してください。

HDF5グループは、tutorialsとCおよびFortranの例があります。あなたがしようとしていることに非常に近い例があります。 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) 
関連する問題