Считайте, что у вас есть квадратная матрица M (N, 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 - это быстрый способ применения периодического граничного условия.
В моей задаче, для 3D-системы {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
....
, но как вы думаете, более элегантное решение в fortran 77?
Я думал о доступе к матрице M с dim D, как если бы у нее было только одно измерение с пространствами N ** D, но я думаю, что если применить if-инструкции внутри контрольного предела N, это будет работать очень медленно , Любая хорошая идея или я должен рассмотреть неприятные петли if-do?
Если вы заботитесь об элегантности и лаконичности, забыть Fortran ** 77 **, это 2015. Но я не вижу проблемы. Зачем вам нужны все три ветви, когда это параметр? В любом случае компилятор будет отбрасывать их во время оптимизации. –