【问题标题】:How to write matrix row by row with implied do loop? [duplicate]如何用隐含的do循环逐行编写矩阵? [复制]
【发布时间】:2021-03-22 08:16:30
【问题描述】:

我的 IDE 是带有 MinGW 9.2.0 的 CodeBlocks。

我需要在文本文件中逐行编写矩阵的帮助。

这是我的简单代码:

program matrix
 
 integer :: i, j 
 integer, dimension(2,2) :: a_mat
 
 forall( i = 1 : 2, j = 1, 2 )
    
   a_mat(i,j) = i + j

 end forall 
 
 open( unit = 15, file = 'matrix_utput.txt', action = 'write' )
  
   write(15,'(*(i2.2,1x))') ( ( a_mat(i,j), j = 1, 2 ), i = 1, 2 )
 
 close( unit = 15 )

end program matrix

在我的.txt 文件中,我得到了这个: 02 03 03 04 如何改变格式来获得这个:

02 03

03 04

【问题讨论】:

  • 链接的问题是相反的问题,但解决方案是相同的,您使用普通的 do 循环进行循环,而我们对各个行使用隐含循环。
  • @VladimirF 这种do循环可以吗?
  • 是的,带有格式转换。但它不太清楚,您必须将大小插入格式 - 当它不固定时。也许我们可以重新提出有关该问题的问题和答案。
  • @VladimirF 你能告诉我怎么做吗?
  • 我花了很多时间寻找重复的,但错过了这个。这是一个非常具体的问题,所以答案也非常具体。我不会删除我的答案,因为阅读与写作之间存在细微差别。

标签: fortran gfortran intel-fortran


【解决方案1】:

正常的方法是在一个do循环中逐行循环,如Write matrix with Fortran所示

但也可以使用格式还原在隐含循环中完成。

 write(15,'(2(i2.2,1x))') ( ( a_mat(i,j), j = 1, 2 ), i = 1, 2 )

基本上,括号前面的数字必须是行长(列数)。如果您将* 放在那里,它将消耗整个数组。这样,每次格式找到它的所有项目时,它都会打开一条新记录。

【讨论】:

  • 也可以去掉尾随空格,但我认为没有必要。
  • 所以,总结一下:这个'(*(1x,i2.2,:))' 不能用于具有任意列数的矩阵,唯一的方法是将列数放入字符变量中并使用// 来创建'(987(1x.i2.3))'. Is that correct?
  • 如果您可以使用显式循环而不是隐含循环,您可以使用 Advance=no 执行此操作,空写入触发换行和原子写入请参阅stackoverflow.com/q/25714322/12150218
  • @Cocofalco 不需要像重复链接和答案中的链接这样的显式循环显示..
  • @HarryKastorp 是的,或者像人们通常使用的那样使用正常的 do 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2011-09-26
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多