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

问题描述 投票:0回答:1

下面的简单示例代码给出了正确的结果。但是,我想对其进行优化或使其更有效率。我创建的构造函数数组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数组的值自动放入。

arrays constructor fortran compiler-optimization
1个回答
0
投票

您会发现您的编译器不喜欢该行

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

不过总的来说,您的问题有点含糊,因此我不确定此答案是否令人满意。如果还不够,请进一步澄清您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.