2

あなたの経験では、Fortran 90 で大きな配列を出力ファイルに保存する最良の方法は何ですか? 以前は、大きな配列を ASCII テキスト ファイルに書き込もうとしていました。たとえば、次のようにします (ページの下部にある推奨事項のおかげで、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の一番上の返信で指摘されているように、行単位で配列をテキスト ファイルに書き込む良い方法は何ですか? 、テキスト ファイルへの大きな配列の書き込みは非常に遅く、必要以上に大きなサイズのファイルが作成されます。そこのポスターは、代わりに次のようなものを使用して、フォーマットされていない Fortran バイナリに書き込むことを推奨しています。

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

これは機能しているようで、実際にははるかに高速であり、返信here で約束されているように、ファイルサイズが小さくなります。しかし、後で Fortran バイナリ (上記の output.dat など) に保存されたデータを操作してその内容を分析できるようにしたい場合はどうすればよいでしょうか? たとえば、バイナリに格納されている配列を Microsoft Excel などのプログラムで開きたい場合はどうすればよいでしょうか?

以前の投稿でmatlab について言及したとき、返信では、バイナリを 16 進数ファイルとして開き、そこからレコードを見つけて抽出するよう提案されました。しかし、私は 16 進法による調査の経験がないため、深い水域に入ることに不安を感じています。Fortran ファイルの読み取りについて、matlab ボード (ここ: http://www.mathworks.com/matlabcentral/answers/12639-advice-on-reading-an-unformatted-fortran-binary-file-into-matlab ) で質問したときmatlab に入ると、その人は Fortran ストリームを使用するのは簡単かもしれないと提案しました。しかし、Fortran ストリーム (つまり、コマンドでディレクティブを使用ACCESS="STREAM") はOPEN、上記の最初の例で作成した ASCII テキスト ファイルと時間とファイル サイズが似ているでしょうか?

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

どうぞよろしくお願いいたします。

4

3 に答える 3

3

ストリームは、フォーマット済み/未フォーマットの選択とは独立した選択です。1 つは「アクセス」、もう 1 つは「フォーマット」です。Fortran I/O のデフォルトは、レコード指向のアクセスです。各レコードの前後に 4 バイトのレコード長を書き込む (少なくともフォーマットされていない) レコードに対する Fortran コンパイラの典型的なアプローチ。(「後」は、逆方向に読みやすくするためのものです。) 16 進編集を使用すると、説明したこれらの余分なデータ項目を検証し、MatLab でそれらをスキップすることができます。しかし、それらは言語標準の一部ではなく、移植性がなく、他の言語では明らかではありません。ストリームと未フォーマットを選択すると、データ項目に対応するバイトの生のシーケンスを取得するだけです。他の言語で余分なデータ項目を心配する必要はありません! 私の経験では、この出力は他の言語でかなり読みやすい傾向があります (MatLab では試していません)。これが他のコンピューターへのファイルの移植性が問題にならない小さくて単純なプロジェクトである場合、HDF5 や FITS などのファイル形式の仕様ではなく、おそらくこのアプローチ (ストリーム & フォーマットなし) を使用します。最後の例のように、配列を write (13) a と書きます。他の言語によっては、次元を転置しなければならない場合があります。これが、移植性が懸念される大規模で長期にわたるプロジェクトである場合は、移植可能な標準ファイル インターフェイスを検討する価値があります。HDF5 や FITS などのファイル形式仕様ではなく、フォーマットされていない)。最後の例のように、配列を write (13) a と書きます。他の言語によっては、次元を転置しなければならない場合があります。これが、移植性が懸念される大規模で長期にわたるプロジェクトである場合は、移植可能な標準ファイル インターフェイスを検討する価値があります。HDF5 や FITS などのファイル形式仕様ではなく、フォーマットされていない)。最後の例のように、配列を write (13) a と書きます。他の言語によっては、次元を転置しなければならない場合があります。これが、移植性が懸念される大規模で長期にわたるプロジェクトである場合は、移植可能な標準ファイル インターフェイスを検討する価値があります。

これらの形式のいずれかが Excel から読み取れるかどうかはわかりません。さらに調査....どんな形式のバイナリファイルを読んでも、Excel が理解できる形式でファイルを出力するプログラムを作成する必要があるかもしれません。

于 2011-08-01T22:40:05.697 に答える
2
 %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)
于 2012-01-05T07:54:16.607 に答える
2

(コメントを後世の回答に変換する)

特に Matlab に情報を取得しようとしていますか? もしそうなら、私はHDF5を強くお勧めします。これは、あなたが探していた移植可能なバイナリ形式です。

Fortran バイナリを HDF5 に変換するには、元の Fortran バイナリを読み込んでから、同じデータを HDF5 ファイルに書き出す必要があります。Fortran のソースがあれば、これは非常に簡単です。配列を割り当て、書き込んだのと同じ順序で配列を読み取ってから、新しい光沢のある HDF5 ファイルを書き出すようにしてください。

HDF5 グループには、C および Fortran の例を含むチュートリアルがあります。あなたがやろうとしていることに非常に近い例がある可能性があります。HDF5 をビルドするときは、Fortran サポートを手動で有効にしてください。デフォルトでは無効になっています。

于 2011-08-01T22:10:47.257 に答える