Печать сложной матрицы Фортран - PullRequest
0 голосов
/ 15 марта 2019

Сложная матрица объявляется так:

complex(8) :: matrix(:,:)

Как я могу напечатать эту матрицу с каждым элементом как: (a, b) или a + ib, и в формате nxn? (под этим я подразумеваю квадратную матрицу со строкой на строку, поэтому будет n строк и n столбцов)

Это способ печати реальной матрицы в нужном мне формате:

do i=1,n
    do j=1,n
        write(*, fmt="(f0.2, tr2)", advance="no") matrix(i,j)
end do
    write(*, fmt="(a)") " "
end do

Но я не уверен, как перевести это на сложную матрицу

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Как можно распечатать эту матрицу с каждым элементом как: (a, b)

Предположим, вы уже знаете, что (a b) является форматом печати по умолчанию для типа complex. Почему этого недостаточно?

do j=1,n
  write(*, *) matrix(:,j)
end do

Вывод будет выглядеть примерно так:

          (10.000000000000000,-20.000000000000000)              (10.000000000000000,-20.000000000000000)              (10.000000000000000,-20.000000000000000)
          (10.000000000000000, 20.000000000000000)              (10.000000000000000, 20.000000000000000)              (10.000000000000000, 20.000000000000000)

Если вы хотите что-то более индивидуальное, вы можете попробовать что-то вроде этого (настройка ширины и точности поля):

do j=1,n
  write(*, "(*('('sf6.2xspf6.2x'i)':x))") matrix(:,j)
end do

Это производит что-то вроде этого:

( 10.00 -20.00 i) ( 10.00 -20.00 i) ( 10.00 -20.00 i)
( 10.00 +20.00 i) ( 10.00 +20.00 i) ( 10.00 +20.00 i)
1 голос
/ 15 марта 2019

Вот кое-что, что работало в прошлом, его можно было бы немного настроить

  !! compile and link with  gfortran -I/usr/include -o PrintComplex  PrintComplex.f90 


Program PrintComplex

  use, intrinsic :: iso_c_binding
  implicit none
  integer, parameter :: N=16
  integer :: k
  real (kind=c_double) :: val(N)
  complex (kind=c_double_complex) :: in(N)
  character(19) fmt

  fmt = '(F7.2,"+",F7.2,"i")'
  val=(/(sin(3.14159d0*float(k)/3.d0),k=1,N)/)
  in=cmplx(val,-val/2)
  print *,"in"
  do k=1,N
     fmt(8:8) = MERGE('+',' ',imag(in(k)).gt.0)
     write(*,fmt)in(k)
  end do
End Program PrintComplex

Вывод:

    in
   0.87   -0.43i
   0.87   -0.43i
   0.00   -0.00i
  -0.87+   0.43i
  -0.87+   0.43i
  -0.00+   0.00i
   0.87   -0.43i
   0.87   -0.43i
   0.00   -0.00i
  -0.87+   0.43i
  -0.87+   0.43i
  -0.00+   0.00i
   0.87   -0.43i
   0.87   -0.43i
   0.00   -0.00i
  -0.87+   0.43i
0 голосов
/ 15 марта 2019

Пока это то, что сработало для меня.Принимая во внимание совет Клинтона:

character(19) fmt
fmt = '(F7.2,"+",F7.2,"i")'

do i=1,n
    do j=1,n
        fmt(8:8) = MERGE('+',' ',imag(a(i,j)).gt.0)
        write(*,fmt, advance="no") a(i,j)
    end do
    write(*, fmt="(a)") " "
end do

И вывод:

 -0.26   -0.00i  -0.00   -0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i 
   0.00+   0.00i  -0.25    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i 
   0.00    0.00i   0.00    0.00i  -0.05    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i 
   0.00    0.00i   0.00    0.00i   0.00    0.00i  -0.05    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i 
   0.00+   0.00i  -0.46   -0.00i  -0.00+   0.00i  -0.00+   0.00i  -0.50    0.00i   0.00   -0.00i   0.00    0.00i  -0.00    0.00i 
   0.32+   0.00i  -0.00+   0.00i   0.00   -0.00i  -0.00   -0.00i   0.00+   0.00i  -0.27    0.00i   0.00    0.00i   0.00    0.00i 
  -0.00+   0.00i   0.00   -0.00i  -0.00   -0.00i   0.24+   0.00i   0.00    0.00i   0.00    0.00i  -0.18    0.00i   0.00    0.00i 
   0.00    0.00i  -0.00   -0.00i   0.24+   0.00i   0.00   -0.00i   0.00    0.00i   0.00    0.00i   0.00    0.00i  -0.18    0.00i 

Если у кого-то есть лучшее предложение, я буду рад его услышать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...