下面的简单示例代码给出了正确的结果。但是,我想对其进行优化或使其更有效率。我创建的构造函数数组y用来生成位置行间距有效,但是它看起来很笨拙且不方便,因为其中的数字非常具体。我想使y数组中的数字更通用,这些变量取决于代码中较早定义的参数。这是代码,然后我会更加清楚:
PROGRAM TestRuns
IMPLICIT NONE
INTEGER :: i, j, k !matrix indices (i,j), spatial index k
INTEGER,PARAMETER :: n=5 !matrix size
REAL, PARAMETER :: a = -6, b =6 !end points of grid
REAL :: h !step size on position grid
REAL :: y(0:6) = (/(k, k=-6,6,2)/) ! generating spatial grid array
DOUBLE PRECISION :: M(n,n) !nxn matrix
h = (b-a)/(n+1)
DO i = 1,n
DO j = 1,n
IF (i .EQ. j) THEN
M(i,j) = y(i)**2
ELSE
M(i,j) = 0
END IF
END DO
END DO
END PROGRAM TestRuns
而不是拥有
REAL :: y(0:6) = (/(k, k=-6,6,2)/) ! this line of code works but is not helpful in generalizing my code at all.
我真的很想写一些更笼统的东西,例如:
REAL :: y(0:n+1) = (/(k, k=a,b,h)/)
我总是在我的代码中首先指定a,b,n,因此我希望从这些参数中能够计算出h和数组y。我不想像现在这样手动将y数组的值自动放入。
您会发现您的编译器不喜欢该行
REAL :: y(0:n+1) = (/(k, k=a,b,h)/)
将其更改为
REAL :: y(0:n+1) = [(k, k=INT(a),INT(b),2)]
即,将k
的上下限变为整数。我怀疑您是否能够衡量效率的任何提高,但是此更改可能会吸引您美观且方便的代码的概念。
您可能还需要调整初始化M
的方式。我会将您的两个循环写为
M = 0.0
DO i = 1,n
M(i,i) = y(i)**2
END DO
不过总的来说,您的问题有点含糊,因此我不确定此答案是否令人满意。如果还不够,请进一步澄清您的问题。