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

Mik*_*ike 1 fortran

我在F90中有类似的代码:

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

do i = 1, 1000

print*,A(i,1,1)

enddo
Run Code Online (Sandbox Code Playgroud)

我很惊讶这个工作,它比简单地循环3个维度更快i,j,k.

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

Vla*_*r F 5

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

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

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

如果你真的这样做了(你应该总是显示你的代码!)

do i=1,10
  do j=1,10
    do k=1,10
      something with A(i,j,k)
Run Code Online (Sandbox Code Playgroud)

那么请注意,这是错误的顺序,你应该循环k,j,我的顺序.

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