2015-11-16 3 views
0

Считайте, что у вас есть квадратная матрица 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?

+4

Если вы заботитесь об элегантности и лаконичности, забыть Fortran ** 77 **, это 2015. Но я не вижу проблемы. Зачем вам нужны все три ветви, когда это параметр? В любом случае компилятор будет отбрасывать их во время оптимизации. –

ответ

0

Я не знаю, Фортран и не уверен, если это вы хотите, но вот некоторые псевдокод, которые могли бы помочь

INTEGER N, D, m 
INTEGER I(D)  ! indices in each dimension 
do j=1,N**D  ! loop over whole matrix 
    m = j   
    do k=1,D   ! for each dimension 
    I(k) = MOD(m,N) ! get index in dimension k 
    m = m/N  ! and move to next most-significant "register" 
    end do 
    ! now you have an array of indices for this item 
    ! do stuff here 
end do 

например D=3, N=100 означает j идет от 1 до 1000000
I последовательно становится массиву [1,1,1], [2,1,1], [3,1,1], ... [100,100,100]

 Смежные вопросы

  • Нет связанных вопросов^_^