如何仅使用一个索引遍历数组?

时间:2017-09-02 20:58:21

标签: fortran

我在F90中有类似的代码:

real(8), dimension(10,10,10) :: A

do i = 1, 1000

print*,A(i,1,1)

enddo

我非常惊讶这是有效的,它比通过i,j,k简单地循环3个维度更快。

有人可以解释为什么会有效吗?

1 个答案:

答案 0 :(得分:5)

您的代码是非法的。但是在引擎盖下,阵列的内存布局恰好是在三维循环k,j,i中的列主要顺序,因此代码似乎有效。但这是非法的。

如果在编译器中启用运行时错误检查(请参阅手册),它将找到错误并报告错误。

如果不启用编译器优化,可能会稍微快一点,因为嵌套循环中存在一些开销,但优化编译器会将代码优化为一个循环。

如果您确实这样做了(您应该始终显示您的代码!!!

do i=1,10
  do j=1,10
    do k=1,10
      something with A(i,j,k)

然后请注意,这是错误的顺序,你应该循环k,j,i顺序。

另请注意,测量打印到屏幕的速度是没有用的,可能非常棘手。一些数学运算更有用。