将Fortran 2D数组打印为矩阵
我有一个目前是3x3的阵列。当我打印出字符时,我会以环绕线样式打印结果。我希望打印一个更可读的正方形矩阵 而不是一行上的XXXXXXXXXXXX。使用do循环是否可能 我有以下资料:将Fortran 2D数组打印为矩阵,fortran,Fortran,我有一个目前是3x3的阵列。当我打印出字符时,我会以环绕线样式打印结果。我希望打印一个更可读的正方形矩阵 而不是一行上的XXXXXXXXXXXX。使用do循环是否可能 我有以下资料: CHARACTER(len=1) :: Grid(2,2) Grid = "*" Print *, Grid 类似于一次打印一个数组行: program printarray implicit none CHARACTER(len=1) :: Grid(3,2) integer :: i Grid
CHARACTER(len=1) :: Grid(2,2)
Grid = "*"
Print *, Grid
类似于一次打印一个数组行:
program printarray
implicit none
CHARACTER(len=1) :: Grid(3,2)
integer :: i
Grid = "x"
do i = 1, ubound(Grid, 1)
print *, Grid(i, :)
end do
end program printarray
或者,可以依赖这样一个事实:如果要写入的内容比格式说明符中的元素多,那么它将切换到新行。比如说:
program printarray2
implicit none
CHARACTER(len=1) :: Grid(4,2)
character(len=10) :: fmt
Grid = "x"
write(fmt, '(A,I0,A)') '(', ubound(Grid, 2), 'A)'
write(*, fmt) transpose(grid)
end program printarray2
这里有一点小技巧,打印整个数组是按内存顺序打印的,这是Fortran中的主要列。这就是为什么您必须转置它(以及为什么您在创建格式字符串时采用维度2而不是维度1的ubound)。根据您想要的输出格式,您不一定需要do循环,以下是最简单的:
program simple
implicit none
CHARACTER(len=1) :: Grid(2,2)
Grid = reshape( ["1","2","3","4"] , shape=shape(Grid) )
write( * , "(A)" ) Grid
end program simple
带有重塑
的行使用Fortran>2003数组构造函数语法[]
。因此,请确保编译器设置已设置为Fortran 2008标准。否则,只需将[]
替换为旧的数组构造函数语法(//)
如果希望每一行打印在不同的行上,则至少需要一个隐含do循环
program simple
implicit none
integer :: i,j
integer, parameter :: n=2
CHARACTER(len=1) :: Grid(n,n)
Grid = reshape( ["1","2","3","4"] , shape=shape(Grid) )
write( * , "(*(g0))" ) ( (Grid(i,j)," ",j=1,n), new_line("A"), i=1,n )
end program simple
我认为,上面的版本避免了编译器创建不必要的临时数组来存储非传染性数组节
Grid(I,:)
,然后再将其打印到输出。g0
编辑描述符是Fortran 2008的一个方便功能。因此,请确保您的编译器支持Fortran 2008标准。[]是>=2003,所以符合2003就足够了。此外,OP要求以矩阵样式(逐行)打印,而不是每行打印一个元素。您的第二种方法似乎令人震惊,您能向我解释一下它的工作原理吗?请向我提供一个我可以阅读更多有关其用法的源代码?第一个write语句创建一个具有正确重复计数的格式字符串,第二个语句写入实际数组。