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 ifor のようにP0?

前もって感謝します。

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 までの配列のスライス(またはセクション) があるため、この場合は 1 つの要素だけですが、配列スライスはスカラーではありません。これは、配列の (同じサイズの) スライスの倍数を引き、2 で割ることによってP更新されます。1P0

次のイテレーションではもう少し興味深いものになりますi==2

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

ここで、配列スライスはそれぞれ 2 つの要素になりました。配列スライスに対する操作は、各配列の対応する要素に適用されるため、このステートメントは 2 つのステートメントとほぼ同等です。

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

これは、ネストされたループのある種の構文糖衣としてではなく、Fortran の用語で、配列セクションの操作として考える方が適切です。

于 2013-08-05T10:26:55.250 に答える