使用数组构造函数优化部分代码

optimizing part of code with array constructor

下面的简单示例代码给出了正确的结果。但是,我想优化它或使其更有效率。我为生成位置线间距而创建的构造函数数组 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

总的来说,你的问题有点含糊,所以我不确定这个答案是否令人满意。如果还不够,再澄清一下你的问题。