1

我正在尝试阅读一些 Fortran 代码,但是对于像这样的数组子集操作,有些东西我无法理解

认为n = 3

和数组

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(12)
REAL(KIND=dp)   :: P(n+1),P0(n)

这条线到底是做什么的?

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

是嵌套循环吗?喜欢jfrom 3to i+2forPkfrom 1to iforP0吗?

提前致谢。

4

1 回答 1

6

走线

P(3:i+2) = P(3:i+2) - i*P0(1:i) / (i+1)

并替换i为(循环1中的第一个值)do

P(3:3) = P(3:3) - 1*P0(1:1) / 2

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

在下一次迭代中会更有趣,使用i==2and

P(3:4) = P(3:4) - 2*P0(1:2) / 3

数组切片现在每个有 2 个元素。数组切片上的操作应用于每个数组中的相应元素,因此该语句大致等效于两个语句

P(3) = P(3) - 2*P0(1) / 3
P(4) = P(4) - 2*P0(2) / 3

最好用 Fortran 术语将其视为数组部分的操作,而不是嵌套循环的某种语法糖。

于 2013-08-05T10:26:55.250 回答