打印复杂矩阵 Fortran

Printing a complex matrix Fortran

复数矩阵是这样声明的:

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

如何以 nxn 格式将每个元素打印为:(a, b) 或 a+ib? (我的意思是方阵,每行一行,所以会有 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

但我不确定如何将其转换为复数矩阵

这是过去有效的方法,可以进行相当多的微调

  !! 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

到目前为止,这对我有用。考虑到克林顿的建议:

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 

如果有人有更好的建议,我会很高兴听到:)

How can I print this matrix with each element as: (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)