2

我想将包含大量数据的矩阵逐行写入文件。例如,我有一个 100*100 的矩阵,我想在文件中以 100*100 的形式拥有它。但是,它不起作用。以下是我的代码和一些描述。N 和 M 是大约数百个整数。RECL 是我设置文件的预期长度,但这里似乎这个命令不起作用。当 N 设置为 99 且 M 设置为 200 时,输出为 198 行。 Vec 是一个双精度复数矩阵。如何输出 Vec 的值并保持其原始格式 N*M?我的编译命令是“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 个字符。(当然,您需要调整该数字)。

但我的猜测是你的 write 语句的格式说明符。您是否尝试逐行而不是逐元素编写矩阵?然后您可以直接指定元素的数量(而不是使用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 回答