использование циклов DO для упрощения дублированного кода - PullRequest
0 голосов
/ 06 марта 2020

Я пишу простой код ниже без использования циклов DO:

PROGRAM testrun
INTEGER,PARAMETER :: n=3
INTEGER :: k
REAL :: x(0:n+1),y(0:n+1),h
REAL, PARAMETER :: a = -6, b = 6
DOUBLE PRECISION :: C(n**2,n**2)

h = (b-a)/(n+1)
x = [(a+k*h, k=0, n+1)]
y = [(a+k*h, k=0, n+1)]

C = 0
C(1,1) = x(1)**2 + y(1)**2
C(2,2) = x(2)**2 + y(1)**2
C(3,3) = x(3)**2 + y(1)**2
C(4,4) = x(1)**2 + y(2)**2
C(5,5) = x(2)**2 + y(2)**2
C(6,6) = x(3)**2 + y(2)**2
C(7,7) = x(1)**2 + y(3)**2
C(8,8) = x(2)**2 + y(3)**2
C(9,9) = x(3)**2 + y(3)**2

END PROGRAM

Как я могу заполнить матрицу C, используя только циклы DO? Я хочу, чтобы он имел точную диагональную форму, как показано выше. Выполнение этого вручную становится утомительным очень быстро, поскольку моя настоящая проблема использует очень большие значения n, поэтому случай n = 3 здесь просто для того, чтобы показать, что я пытаюсь сделать.

1 Ответ

2 голосов
/ 06 марта 2020

Я думаю, что это должно работать:

do j = 1,n
do i = 1,n

    k = (j-1)*(n)+i
    C(k,k) = x(i)**2 + y(j)**2

enddo
enddo

Просто проверка для случая, когда n = 3 (так же, как ваш пример):

j = 1, i = 1, k = 1 --> C(1,1) = x(1)**2 + y(1)**2
       i = 2, k = 2 --> C(2,2) = x(2)**2 + y(1)**2
       i = 3, k = 3 --> C(3,3) = x(3)**2 + y(1)**2
j = 2, i = 1, k = 4 --> C(4,4) = x(1)**2 + y(2)**2
       i = 2, k = 5 --> C(5,5) = x(2)**2 + y(2)**2
       i = 3, k = 6 --> C(6,6) = x(3)**2 + y(2)**2  
j = 3, i = 1, k = 7 --> C(7,7) = x(1)**2 + y(3)**2
       i = 2, k = 8 --> C(8,8) = x(2)**2 + y(3)**2
       i = 3, k = 9 --> C(9,9) = x(3)**2 + y(3)**2  
...