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