2

大量のデータを含む行列を行ごとにファイルに書き込みたい。たとえば、100*100 のマトリックスがあり、ファイル内で 100*100 の形式にしたいとします。ただし、機能しません。以下は私のコードと説明です。N と M は数百程度の整数です。RECL は予想される長さです ファイルを設定しましたが、ここではこのコマンドが機能しないようです。N が 99 に設定され、M が 200 に設定されている場合、出力は 198 行になります。Vec は倍精度の複素行列です。元の形式 N*M を維持したまま Vec の値を出力するにはどうすればよいですか? 私のコンパイル コマンドは「ifort -o out test.f90」です。

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace",RECL=40*M+10)
do i=1,N
 do j=1,M
  write(2, '(F)', advance='no') real(Vec(i,j)) 
 end do
  write(2, *) '' 
end do

@george のアドバイスに従って、次のようなプログラムをコーディングしました。

program test
implicit none

integer i,j

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,500
 write(2, '(1600F14.7)')( 0.00001 ,j=1,499)
end do

close(2)

end

このコードで、問題は解決しました!前回は正しくコンパイルできなかったのかもしれません。

4

2 に答える 2

5

私のコメントを拡張すると、暗黙のループも使用する必要があります..これを試してください:

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
     write(2, '(1000F14.7)')( real(Vec(i,j)) ,j=1,M)
end do

または十分に最新のコンパイラの場合(どのように新しいかはわかりません..)

     write(2, '(*(F14.7))')( real(Vec(i,j)) ,j=1,M)

指摘されているように、2008 標準の無制限フォーマット項目には括弧(F14.7)が必要であることに注意してください。*

他のコメントを引き込むこともできます。これを行うこともできます。

      write(2, '(*(F14.7))')real(Vec(i,:M))
于 2013-09-17T12:33:15.020 に答える
2

ifortはデフォルトのレコード長 を使用します80。それを超えるものはすべて次の行に配置されます。を発行することで、実行時にこれを拡張できます。これによりexport FORT_FMT_RECL=250、250 文字に拡張されます。(もちろん、その数を調整する必要があります)。

しかし、私の推測では、書き込みステートメントのフォーマット指定子です。要素ごとではなく、行ごとに行列を書き込もうとしましたか? 次に、(を使用する代わりに)要素の数を直接指定できますadvance='no'

この投稿も役立つかもしれません!

編集:行ごとの書き込みは、次のように実現できます。

open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
  write(2,*) real( Vec(i,:) ) 
end do
close(2)
于 2013-09-17T07:47:52.817 に答える