如何用 fortran77 将格式化后的矩阵写成一行?
How to write the formatted matrix in a lines with fortran77?
假设我有矩阵 c(i,j)。我想用最古老的 Fortran77 语言在屏幕上用逗号后的三个符号来写它。我写
do i=1,N
write(*,"(F8.3)") ( c(i,j), j=1,N )
end do
但输出的形式是
c(1,1)
c(1,2)
...
c(1,10) c(2,1)
c(2,2)
...
最后,我可能会简单地写
do i=1,N
write(*,*) ( c(i,j), j=1,N )
end do
然后输出就像矩阵一样,但是,当然,它没有格式化。
如何在 Fortran77 中获得正确的输出?
编辑。似乎解决方案之一是写
do i=1, N
do j=1, N
write(*,'(F9.3,A,$)') c(i,j), ' '
end do
write(*,*) ' '
end do
您的格式只指定了一个浮点数,但您实际上想每行写 N
。
这个简单案例的一个相当通用的解决方案类似于
program temp
implicit none
integer, parameter :: N=3
real, dimension(N,N) :: c
integer :: i,j
character(len=20) :: exFmt
c = 1.0
write(exFmt,'("(",I0,"(F8.3))")') N
do i=1,N
write(*,exFmt) (c(i,j), j=1,N)
end do
end program
这将使 exFmt
成为 '(3(F8.3))'
,它指定打印三个浮点数(请注意,您可能确实希望 '(3(F8.3," "))'
明确包含一些间距)。
注意一些编译器将允许 exFmt
只是 '(*(F8.3))'
。这是 fortran 2008 规范的一部分,因此您可以访问的所有编译器可能都没有提供。有关编译器支持的摘要,请参阅 here(请参阅 无限格式项 ,感谢 HighPerformanceMark)
最后一个简单的方法是使用像 '(1000(F8.3))'
这样的格式语句,其中 1000 比您需要的要大。
假设我有矩阵 c(i,j)。我想用最古老的 Fortran77 语言在屏幕上用逗号后的三个符号来写它。我写
do i=1,N
write(*,"(F8.3)") ( c(i,j), j=1,N )
end do
但输出的形式是
c(1,1)
c(1,2)
...
c(1,10) c(2,1)
c(2,2)
...
最后,我可能会简单地写
do i=1,N
write(*,*) ( c(i,j), j=1,N )
end do
然后输出就像矩阵一样,但是,当然,它没有格式化。
如何在 Fortran77 中获得正确的输出?
编辑。似乎解决方案之一是写
do i=1, N
do j=1, N
write(*,'(F9.3,A,$)') c(i,j), ' '
end do
write(*,*) ' '
end do
您的格式只指定了一个浮点数,但您实际上想每行写 N
。
这个简单案例的一个相当通用的解决方案类似于
program temp
implicit none
integer, parameter :: N=3
real, dimension(N,N) :: c
integer :: i,j
character(len=20) :: exFmt
c = 1.0
write(exFmt,'("(",I0,"(F8.3))")') N
do i=1,N
write(*,exFmt) (c(i,j), j=1,N)
end do
end program
这将使 exFmt
成为 '(3(F8.3))'
,它指定打印三个浮点数(请注意,您可能确实希望 '(3(F8.3," "))'
明确包含一些间距)。
注意一些编译器将允许 exFmt
只是 '(*(F8.3))'
。这是 fortran 2008 规范的一部分,因此您可以访问的所有编译器可能都没有提供。有关编译器支持的摘要,请参阅 here(请参阅 无限格式项 ,感谢 HighPerformanceMark)
最后一个简单的方法是使用像 '(1000(F8.3))'
这样的格式语句,其中 1000 比您需要的要大。