打印复杂矩阵 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)
复数矩阵是这样声明的:
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)