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ストリームのいずれかの良いチュートリアルについて知っていますか?
ありがとうございます。
具体的に情報をmatlabに取得しようとしていますか?あなたがいるなら、私はHDF5を強く勧めます。これはあなたが探していたポータブルバイナリフォーマットです。 – matt
ありがとう!はい、情報をmatlabに入れても問題ありません。実際に人間が判読できる形式はすばらしいでしょう。 HDF5の使い方、特にFortran 90からそのようなファイルを書く方法や、FortranバイナリをHDF5に変換する方法についてのアドバイスはありますか? – Andrew
ACCESS = 'DIRECT'を使用して1レコードを使用し、レコード長を配列のサイズに設定することで、レコードマーカーを避けることができます。これにより、ファイル内のデータだけが得られます。その後、バイナリファイルとしてMatlabで読み取ることができます。 – steabert