2014-02-05 51 views
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 = ga3/detW行上的detW的值恰好爲1.0時,只需要很長時間。爲什麼會發生?爲什麼按1.0分區會導致程序運行時間長3571%?

+0

不知道爲什麼,但是如果detW是1,你可以在裏面放一個'if'語句來簡單地使detW等於ga3,然後繼續生活。 –

+0

謝謝,我知道解決方法 - 我主要好奇爲什麼會發生這種情況,因爲任何真實世界的代碼實現幾乎肯定不會有一個單一的決定因素。 – drjrm3

回答

0

我發現減速的來源實際上是在Ng = (det1*detW)**pt5行 - 使用sqrt大大減少了時間。

相關問題