0

次の行列式の分析式をコーディングしています。

  detW = &
  (one+be*(u11+u22+u33)-&
  be2*(u12sq+u13sq-u11*u22+u23sq-u11*u33-u22*u33)-&
  al2*(-(u11*u22)+u13sq*(one+three*be*u22)-six*be*u12*u13*u23+u23sq+three*be*u11*u23sq-&
  u11*u33-u22*u33-three*be*u11*u22*u33+u12sq*(one+three*be*u33))-&
  al3*(u13sq*u22-two*u12*u13*u23+u12sq*u33+u11*(u23sq-u22*u33))-&
  be3*(u13sq*u22-two*u12*u13*u23+u12sq*u33+u11*(u23sq-u22*u33))+&
  al*(u22+u33-three*be2*(u13sq*u22-two*u12*u13*u23+u12sq*u33)-&
  two*be*(u12sq+u13sq+u23sq-u22*u33)+&
  u11*(one+two*be*(u22+u33)-three*be2*(u23sq-u22*u33))))
  print*, 'detW = ', detW
  print*, 'ga3 = ', ga3
  detW = ga3/detW
  Ng = (det1*detW)**pt5

行列式の真の値は、最初の大きな部分が分母で、ga3 が分子です。この行列式を計算しないと、私のコード (合計で約 176,000 行のコード) は約 0.07 秒かかりますが、この行列式を計算すると、プログラム全体で約 2.5 秒かかります。さらに、犯人は行であることがわかりましたdetW = ga3/detW。この行をコメントアウトすると、ランタイムは 0.07 に戻ります。

detWライン上のの値detW = ga3/detWが正確に 1.0の場合にのみ、この時間がかかります。なぜこれが起こるのでしょうか?1.0 で除算すると、プログラムの実行時間が 3571% かかるのはなぜですか?

4

1 に答える 1

0

実際、速度低下の原因はラインにあることがわかりましたNg = (det1*detW)**pt5-を使用sqrtすると、時間が大幅に短縮されます。

于 2014-02-05T22:31:55.787 に答える