打印复杂的矩阵Fortran

时间:2019-03-14 22:28:37

标签: matrix printing fortran linear-algebra complex-numbers

复杂矩阵是这样声明的:

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

但是我不确定如何将其转换为复杂的矩阵

3 个答案:

答案 0 :(得分:1)

这是过去有效的方法,可以对其进行一些微调

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

答案 1 :(得分:1)

  

如何将每个元素的矩阵打印为:(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)

答案 2 :(得分:0)

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

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 

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