【问题标题】:Generate Hilbert matrix Fortran生成希尔伯特矩阵 Fortran
【发布时间】:2014-02-14 17:04:32
【问题描述】:

我刚开始使用 Fortran,我正在尝试生成一个非常简单的 4x4 希尔伯特矩阵,但我的输出是一堆零,除了一开始的 1。任何帮助将不胜感激。

代码如下:

PROGRAM HILBERT
IMPLICIT NONE
REAL :: a(4,4)
REAL :: i, j

!Initialise matrix a with non zeroes
 i = 1.0
 j = 1.0

DO  i = 1,4,1
 a(i,4) = 0.0 
 DO  j = 1,4,1

a=1.0/(i+j-1.0)     !Attempt to generate Hilbert matrix

  WRITE(6,'(f3.0)',advance='no') a(i,j)   !formatted output

 END DO
    write(6,*) !formatted output
END DO 

END PROGRAM HILBERT

【问题讨论】:

  • 除了答案:不要将real 变量用于DOs。

标签: matrix fortran


【解决方案1】:

从您给定的代码开始:

PROGRAM HILBERT
IMPLICIT NONE
REAL :: a(4,4)
REAL :: i, j


DO  i = 1,4 ! The third argument is not necessary if equal to 1
 DO  j = 1,4
  a(i,j) = 1.0/(i+j-1.0) ! generate Hilbert matrix

  WRITE(6,'(f8.5)',advance='no') a(i,j)   !formatted output
 END DO
 write(6,*) !formatted output
END DO 

END PROGRAM HILBERT

ij 的初始化不是必需的,因为循环会自动执行此操作。

a(i,4) = 0 的初始化应该是a(i,j) = 0,但这不是必须的。按照 M.S.B. 的建议,您可以在开头使用 a = 0 进行此初始化,但在这种情况下这不是必需的。

一件非常重要的事情:您的格式代码不显示数字的小数部分。

并且:根据较新的标准,循环变量(在这种情况下为 ij)必须是整数,因为实数的行为是不明确的。

【讨论】:

  • 非常感谢您抽出宝贵时间,我的格式线让我退缩了。她现在已经启动并运行,我终于可以开始计算她的行列式了。
【解决方案2】:

array=scaler 将数组的所有元素设置为缩放器。试试a(i,j)=...

【讨论】:

    【解决方案3】:

    除了更正@M.S.B.并且@Stefan 指出,您还可以使用forall 语句更有效地(在代码和易错性方面)创建这样的矩阵:

    program hilbert
      implicit none
      real a(4,4)
    
      integer i,j
    
      forall(i=1:4, j=1:4) a(i,j) = 1/(i+j-1.0)
    
    ! As @Stefan says, the format is an important part of the answer
      print '(4F8.5)', a
    
    end program hilbert
    

    【讨论】:

    • 感谢您向我介绍 forall 声明,这似乎可以节省时间!
    猜你喜欢
    • 2019-05-18
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多