如何将2D数组打印为单个1D行?

时间:2019-02-28 04:01:12

标签: fortran

我正在使用以下循环在fortran中构造一个非常简单的2D数组:

      do i = 1, N
         do j = 1, M
            A(i, j) = i * 10 + j
         end do
      end do

然后我创建了一个子例程,将其打印为2D数组:

      implicit none

      real*8 A(N, M)
      integer i, j

      do i = 1, N
         do j = 1, M
            write(*, ' (F4.0)', advance='no') A(i, j) ! this is Fortran90
         end do
         write(*, *)
      end do

      end subroutine

输出为:

 print_matrix
 11. 12. 13. 14.
 21. 22. 23. 24.
 31. 32. 33. 34.

我现在要获取所有元素,并按行本身的顺序将它们放入一行。 (我希望这是有道理的)。而且我想制作一个可以在不更改主要功能的情况下执行此操作的打印功能。

通过以下子例程,我非常接近我想要的东西:

      implicit none

      real*8 A(N, M)
      integer i

      do i = 1, N
          write(*, ' (F4.0)', advance='no') A(i,:) ! this is Fortran90
      write(*, *)
      end do

      end subroutine

它的输出是

 print_matrix_linear
 11.
 12.
 13.
 14.
 21.
 22.
 23.
 24.
 31.
 32.
 33.
 34.

但这不是我想要的。元素的顺序是正确的,但这只是一个。我基本上想转置此数组并将其全部放入一个 row

请提供一些有关如何执行此操作的建议。非常感谢!

-CJW

1 个答案:

答案 0 :(得分:2)

您的初始解决方案距离不太远:

write(*, '(F4.0)', advance='no') A(i, :)

使用advance='no'时,write语句不会在行的末尾前进,只是您只给出单个值的格式,而是将4个值传递给其中。

如果您编写的值超出了format语句的预期,它将以多行形式将它们写出,并且只有最终值会被advance='no'兑现,因此您将得到类似的信息:

11.
12.
13.
14. 21.
22.
23.
24. 31.
...

仅仅是您添加了一个新的

write(*, *)

在下一行中,然后前进该行并将其全部显示在输出中。

您可以按照自己的格式添加元素数量。您可能需要使用以下内容:'(4F4.0)'。 -或者,如果您不知道有多少个值,可以使用星号:'(*(F4.0))'。 (不幸的是,带星号的第二组括号是必需的。)

通过更改此格式并删除空的write语句,您应该得到想要的东西。

现在,如果我这么大胆,请介绍一下格式。

  • 您有一个初始空格,如下所示:' (F4.0)'-这个空格没有任何作用。该格式将意味着每个值仅保留4个字符(包括句点)。如果要在每个值中添加一个空格,则必须采用以下方式:'(X,F4.0)''(" ",F4.0)'

    或者,如果您很懒惰,只需再给它一个字符来写值:(F5.0)

  • 由于fortran中的多维数组更改索引的方式无论如何都要以最快的方式进行,因此您可以将整个打印循环替换为:

    write(*, '(*(X, F4.0))') A