Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 如何将大型矩阵逐行写入文件(fortran 90)_Matrix_Fortran_Intel Fortran - Fatal编程技术网

Matrix 如何将大型矩阵逐行写入文件(fortran 90)

Matrix 如何将大型矩阵逐行写入文件(fortran 90),matrix,fortran,intel-fortran,Matrix,Fortran,Intel Fortran,我想将包含大量数据的矩阵逐行写入文件。例如,我有一个矩阵100*100,我希望它在文件中以100*100的形式存在。但是,它不起作用。下面是我的代码和一些描述。N和M是大约几百个整数。RECL是我设置的文件的预期长度,但这里似乎这个命令不起作用。当N设置为99时,输出为198行 M设置为200。Vec是一种双精度复数矩阵。如何输出Vec的值以保持其原始格式N*M?我的编译命令是“ifort-out test.f90” 按照@george的建议,我编写了如下程序: program test imp

我想将包含大量数据的矩阵逐行写入文件。例如,我有一个矩阵100*100,我希望它在文件中以100*100的形式存在。但是,它不起作用。下面是我的代码和一些描述。N和M是大约几百个整数。RECL是我设置的文件的预期长度,但这里似乎这个命令不起作用。当N设置为99时,输出为198行 M设置为200。Vec是一种双精度复数矩阵。如何输出Vec的值以保持其原始格式N*M?我的编译命令是“ifort-out test.f90”

按照@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
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
  write(2,*) real( Vec(i,:) ) 
end do
close(2)

有了这段代码,问题就解决了!可能我上次没有正确编译。

ifort
使用默认记录长度
80
。除此之外的所有内容都放在下一行。您可以在运行时通过发出
export-FORT\u-FMT\u-RECL=250
,将其扩展到250个字符。(当然,您需要调整该数字)

但我猜你的书面陈述的格式说明符是什么。您是否尝试过逐行而不是按元素编写矩阵?然后可以直接指定元素的数量(而不是使用
advance='no'

可能也会有帮助

编辑: 逐行写入可以这样实现:

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
open(unit=2, file='graph1.txt', ACTION="write", STATUS="replace")
do i=1,N
  write(2,*) real( Vec(i,:) ) 
end do
close(2)

扩展我的评论,您还应该使用隐式循环..尝试以下操作:

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
或者对于足够现代的编译器(我不知道有多新…)

注:如前所述,2008标准中的
*
无限制格式项需要
(F14.7)
周围的括号

也可以拉入其他评论,您也可以这样做:

      write(2, '(*(F14.7))')real(Vec(i,:M))

那么它做什么呢?什么是“不工作”?如何声明
Vec
?我希望您不要尝试在100x100阵列上使用不同的
M
N
运行代码?您需要格式中的重复说明符。在旧版fortran中,您需要一个实际的数字,例如“1000F14.7”,其中的数字大于m。最近的标准允许使用“*”。。带有advance=no的显式格式将覆盖打开时为recl设置的任何内容。“不工作”意味着当M超过特定数字(如200300)时,一行的元素将占用文件中的3行。我想要的是一行一行地存储在代码中。Vec是可分配的数组Vec(N,M),所以不用担心它的合法性…嗯,你的代码对我来说很好-对于
gfortran
(4.7.3)和
ifort
(13.1.3)。你使用的是哪个版本的ifort?我对ifort很熟悉,所以我没有真正了解你的想法。我应该把这句话附加在哪里“export FORT_FMT_RECL=250”?在我的代码中?哦,这是您在运行时指定的东西-所以只需调用您的程序,如
export FORT\u FMT\u RECL=250/a、 out
FORT\u FMT\u RECL=250./a.out
明白了。非常感谢。我仍然想知道如何决定RECL号码。这是哥伦布数的几倍吗?我设置了N=500和M=1500,并像这样运行“FORT_FMT_RECL=3000./a.out”,但得到了一个包含2994行的txt文件……我应该在代码中也设置RECL号吗?我按照您的建议尝试了,但FORT_FMT_RECL=似乎不起作用。我正在考虑你的建议“逐行编写矩阵”。你能提供更多的信息吗?如果你在open语句中指定了记录长度,我想这里指定的数字优先。我在答案中添加了一些示例代码,但没有明确的
RECL
。因此,
FORT\u FMT\u RECL=
应该会产生影响。这是Fortran 2008的无限制格式项,至少受当前版本的
ifort
gfortran
的支持。请看。出于好奇:隐式循环比上一个答案中的部分数组有什么好处?@AlexanderVogt这里没有区别,因为real()可以接受向量或标量参数。I/O中的隐式do有时比数组子部分慢