【问题标题】:Format specifier for a complex matrix复杂矩阵的格式说明符
【发布时间】:2016-11-11 12:00:14
【问题描述】:

我已经在 fortran format specifier for complex number 阅读了有关复数格式说明符的信息

但是我无法根据自己的意愿对其进行修改。我有已知维度的双复矩阵,我希望它写成这样:

{1.000E+00, 0.000E+00} {2.123E+00, 6.545E+20} {5.456E+24, 5.562E+12} ....
{1.000E+00, 0.000E+00} {2.123E+00, 6.545E+20} {5.456E+24, 5.562E+12}
{1.000E+00, 0.000E+00} {2.123E+00, 6.545E+20} {5.456E+24, 5.562E+12}
...

所以大括号中的第一部分应该是实部,第二部分应该是虚部。矩阵元素应分别放在大括号中,并根据矩阵中的位置相邻放置。

到目前为止,我可以正确打印出一个元素或所有矩阵元素,格式如下:("{",ES10.3, ",", 1X, ES10.3 ,"}")

编辑:

program test
  implicit none
  double complex                    ::  zz
  double complex, dimension(3,4)    ::  aa
  character (len=32)                ::  fmtString

  zz = cmplx(1.d0, -2.d0)

  fmtString = '("{",ES10.3, ",", 1X ES10.3,"}")'
  write(0,fmt = fmtString) zz   !works
  write(0,fmt = fmtString)aa    !not formatted propperly
end program test

结果是这样的,因为 aa 没有被初始化:

{ 1.000E+00, -2.000E+00}   <- zz works
{ 9.881-324,  9.387-323}   <- aa doesn't since it is not displayed as a 3x4 matrix
{ 6.953-310,  0.000E+00}
{ 0.000E+00,  0.000E+00}
{ 1.812-314,  6.953-310}
{ 0.000E+00,  1.019-312}
{ 0.000E+00,  0.000E+00}
{ 4.496-322,  0.000E+00}
{ 0.000E+00,  2.631-312}
{ 0.000E+00,  2.631-312}
{ 0.000E+00,  1.210-316}
{ 1.210-316,  1.210-316}
{ 1.210-316,  3.953-323}

那么我该怎么做呢?

【问题讨论】:

  • ... 这些值无关紧要,因为它应该是一个通用的矩阵输出子程序。所以困扰我的是印刷品的布局。我怎样才能实现,例如,在行和列中排序的值就像在 maltab 中的输出一样?
  • 您只需要在格式中添加一个重复说明符。这里一定有一个很好的问题可以指点你,但我现在找不到。您可能还想将重复计数设为变量(对此会有另一个问题)。

标签: formatting fortran


【解决方案1】:
program test
  implicit none
  double complex                    ::  zz
  double complex, dimension(3,4)    ::  aa
  character (50)                    ::  fmtString
  integer                           ::  i

  zz = cmplx(1.d0, -2.d0)
  aa = zz ! aa needs to be initialized too

  fmtString = '(9999("{",ES10.3,",",1X,ES10.3,"}",:,1X))'

  write(*,fmt = fmtString) zz
  do i=1,size(aa,1)
     write(*,fmt = fmtString) aa(i,:)
  enddo
end program test

【讨论】:

  • 谢谢!分号在做什么?我还稍微概括了 9999,因为可能会出现想要输出更大的矩阵:write(fmtString,'(I0)') size(aa,2) 然后fmtString = '('// trim(fmtString) //'("{",ES10.3, ",", 1X, ES10.3,"}",:,1X))'
  • 分号只是避免了每行末尾的最后一个空格。 (当没有数据要打印时,分号后面的元素将被忽略)。您的建议当然是可以接受的,但如果您的编译器支持它(F2008),只需将我的 9999 替换为字符 *(无限重复)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多