2015-11-16 98 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矩阵的维数就是一个pa rameter?我的意思是,我可以这样做:

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中更优雅的解决方案?

我在考虑使用暗淡的D访问M矩阵,就好像它只有一个具有N ** D空格的维度,但我认为如果应用if-指令来控制N的限制,它将工作得非常慢。任何好主意或我应该考虑讨厌的if-do循环?

+4

如果你关心优雅或简洁,忘记的Fortran ** ** 77,它是2015年。但我看不出问题。当它是参数时,为什么你需要所有三个分支?无论如何,编译器会在优化期间丢弃它们。 –

回答

0

我不知道Fortran和不知道这是你想要的,但这里的一些伪代码,可以帮助

​​

例如D=3N=100意味着 j变为1〜1000000
I先后成为数组[1,1,1], [2,1,1], [3,1,1], ... [100,100,100]