【发布时间】:2015-11-16 17:54:54
【问题描述】:
假设您有一个方阵 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 中更优雅的解决方案?
我正在考虑使用暗 D 访问 M 矩阵,就好像它只有一个带有 N**D 空间的维度,但我认为如果在 N 的控制限制内应用 if 指令,它将工作得非常慢。有什么好主意,还是我应该考虑讨厌的 if-do 循环?
【问题讨论】:
-
如果你关心优雅或简洁,忘记 Fortran 77,它是 2015 年。但我看不到问题所在。为什么当它是参数时你需要所有三个分支?无论如何,编译器都会在优化期间丢弃它们。