【问题标题】:Fortran 90 array subsetsFortran 90 数组子集
【发布时间】:2013-08-05 10:08:58
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: arrays fortran


    【解决方案1】:

    排队

    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 上,您有一个 slice(或部分)数组 P 从元素 3 到元素 3,所以在这种情况下只有一个元素 - 但仍然是数组切片而不是标量.这是通过将数组P0 的(相同大小的)切片减去1 并除以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 术语将其视为数组部分的操作,而不是嵌套循环的某种语法糖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 2016-12-15
      • 2010-10-24
      • 2017-09-14
      • 2020-11-01
      • 1970-01-01
      • 2012-06-04
      • 2015-03-14
      相关资源
      最近更新 更多