оптимизация части кода с помощью конструктора массива - PullRequest
0 голосов
/ 23 февраля 2020

Следующий простой пример кода дает правильные результаты. Тем не менее, я хотел бы оптимизировать его или сделать его более эффективным. Массив конструкторов y, который я создаю для генерации межстрочного интервала, работает, но он очень неуклюже выглядит и неудобен, поскольку числа в нем очень специфичны c. Я хочу сделать числа в массиве 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 вручную, как я делаю сейчас.

1 Ответ

1 голос
/ 23 февраля 2020

Вы обнаружите, что вашему компилятору не нравится строка

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

В целом, однако, ваш вопрос немного расплывчат, поэтому я не уверен, насколько удовлетворительным будет этот ответ. Если этого недостаточно, уточните свой вопрос еще.

...