Как распечатать 2D массив в виде одной 1D строки? - PullRequest
0 голосов
/ 28 февраля 2019

Я создаю очень простой 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.

Но это не совсем то, что я хочу.Порядок элементов правильный, но это все один столбец .Я в основном хочу переместить этот массив и поместить все в одну строку .

Пожалуйста, предоставьте несколько советов, как мне это сделать.Большое вам спасибо!

-CJW

1 Ответ

0 голосов
/ 28 февраля 2019

Ваше первоначальное решение было не слишком далеко:

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

При advance='no' оператор записи не будет продвигать строку в конце, за исключением того, что вы задаете формат только для одного значения,но передайте в него 4 значения.

Если вы напишите больше значений, чем ожидает оператор формата, он запишет их в несколько строк, и только окончательное значение будет иметь значение 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)

  • Поскольку многомерные массивы в фортране изменяют индексы быстрее, чем вы хотите их в любом случае, вы можете заменить весь цикл печати просто:

    write(*, '(*(X, F4.0))') A
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...