打印复杂的矩阵fortran



复杂矩阵是这样声明的:

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

但我不确定如何将其翻译成复杂的矩阵

如何用每个元素打印此矩阵为:(a,b)

假设您已经知道(a b)complex类型的默认打印fotmat,为什么这不够?

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)

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

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 

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

以下是过去有效的东西,可以对其进行微调

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

相关内容

  • 没有找到相关文章

最新更新