Учтите, что у вас есть квадратная матрица M(N,N) и вы хотите просуммировать все пары, такие что:
M(i,j)*M(i+1,j)+M(i,j)*M(i,j+1)
для этого проще всего вычислить:
INTEGER i,j,N, SUMT
INTEGER M(100,100), c(101)
N=100
SUMT = 0
do j=1,N
c(j) = j
end do
c(N+1)=1
do j=1,N
do i=1,N
SUMT = SUMT + M(i,j)*M(c(i+1),j)+M(i,j)*M(i,c(j*1))
end do
end do
ПРИМЕЧАНИЕ. c — это быстрый способ применить периодическое граничное условие.
В моей задаче для трехмерной системы {M(N,N,N)} я должен сделать следующее:
M(i,j,k)*M(i+1,j,k)+M(i,j,k)*M(i,j+1,k)+M(i,j,k)*M(i,j,k+1)
Итак, код:
INTEGER i,j,k,N, SUMT
INTEGER M(100,100), c(101)
SUMT = 0
do j=1,N
c(j) = j
end do
c(N+1)=1
N=100
do j=1,N
do i=1,N
SUMT = SUMT +M(i,j,k)*M(c(i+1),j,k)+M(i,j,k)*M(i,c(j+1),k)+M(i,j,k)*M(i,j,c(k+1))
end do
end do
На данный момент мой вопрос:
Есть ли способ вычислить эту проблему с вложенными циклами, такой размер матрицы M является параметром? Я имею в виду, я мог бы сделать:
INTEGER i,j,k,l,m,n,....
INTEGER N, SUMT, D
PARAMETER (N=100)
PARAMETER (D=3) !DIMENSION
INTEGER M(N**D), c(N+1)
if (dim=1) then
do i=1,N
else if (dim=2) then
do j=1,N
do i=1,N
else if (dim=3) then
do k=1,N
do j=1,N
do i=1,N
....
но вы думаете о более элегантном решении на фортране 77?
Я думал о доступе к матрице M с dim D, как если бы она имела только одно измерение с пробелами N ** D, но я думаю, что если применить инструкции if внутри предела контроля N, это будет работать очень медленно. Любая хорошая идея, или я должен рассмотреть неприятные циклы if-do?