Fortran 90阵列子集

1 arrays fortran

我正在尝试阅读一些Fortran代码,但有一些我无法理解的数组子集操作,就像这个

假设 n = 3

和阵列

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(12)
REAL(KIND=dp)   :: P(n+1),P0(n)
Run Code Online (Sandbox Code Playgroud)

这条线究竟做了什么?

DO i=1,n-1
  …..
  P(3:i+2) = P(3:i+2) - i*P0(1:i) / (i+1)
  ….
END DO
Run Code Online (Sandbox Code Playgroud)

它是嵌套循环吗?像j来自3i+2Pk1iP0

提前致谢.

Hig*_*ark 6

走线

P(3:i+2) = P(3:i+2) - i*P0(1:i) / (i+1)
Run Code Online (Sandbox Code Playgroud)

并替换i1(do循环中的第一个值)

P(3:3) = P(3:3) - 1*P0(1:1) / 2
Run Code Online (Sandbox Code Playgroud)

在lhs上,你有一个从元素3到元素3 的数组切片(或部分)P,所以在这种情况下只有一个元素 - 但仍然是一个数组切片而不是标量.通过减去1(相同大小)数组切片的次数P0并除以2来更新.

它在下一次迭代中更有趣,有i==2

P(3:4) = P(3:4) - 2*P0(1:2) / 3
Run Code Online (Sandbox Code Playgroud)

其中数组切片现在各有2个元素.对数组切片的操作应用于每个数组的相应元素,因此该语句大致相当于两个语句

P(3) = P(3) - 2*P0(1) / 3
P(4) = P(4) - 2*P0(2) / 3
Run Code Online (Sandbox Code Playgroud)

最好用Fortran术语来考虑这个,作为数组部分的操作,而不是嵌套循环的某种语法糖.