考虑到你有一个方阵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是应用周期性边界条件的快速方法。
在我的问题中,对于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中有一个更优雅的解决方案吗?
我正在考虑使用Dim D访问M矩阵,好像它只有一个带有N ** D空格的维度,但我认为如果在控制N的控制范围内应用if-instructions,它将工作得非常慢。任何好主意或我应该考虑讨厌的if-do循环?
答案 0 :(得分:0)
我不了解fortran并且不确定这是否是你想要的,但这里有一些可能有帮助的伪代码
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
e.g。 D=3
,N=100
表示
j
从1到1000000
I
先后成为数组[1,1,1], [2,1,1], [3,1,1], ... [100,100,100]