Fortran 90阵列子集

时间:2013-08-05 10:08:58

标签: arrays fortran

我正在尝试阅读一些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

它是嵌套循环吗?就j3i+2 Pk1i P0一样?

提前致谢。

1 个答案:

答案 0 :(得分:6)

走线

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

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

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

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

在下一次迭代中,使用i==2

会更有趣
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术语来考虑这个,作为数组部分的操作,而不是嵌套循环的某种语法糖。