我正在尝试阅读一些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
来自3
于i+2
对P
和k
从1
到i
的P0
?
提前致谢.
走线
P(3:i+2) = P(3:i+2) - i*P0(1:i) / (i+1)
Run Code Online (Sandbox Code Playgroud)
并替换i
为1
(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术语来考虑这个,作为数组部分的操作,而不是嵌套循环的某种语法糖.