2013-04-15 58 views
1

我想在C++中計算二維數組的複數。代碼運行速度非常緩慢,我已經將主要原因縮小爲exp函數(即使我有4個嵌套循環,當我註釋掉該行時,程序會很快運行)。C++ - 改進複雜數學運算的計算時間

int main() { 

    typedef vector< complex<double> > complexVect; 
    typedef vector<double> doubleVect; 

    const int SIZE = 256; 
    vector<doubleVect> phi_w(SIZE, doubleVect(SIZE)); 
    vector<complexVect> phi_k(SIZE, complexVect(SIZE)); 
    complex<double> i (0, 1), cmplx (0, 0); 
    complex<double> temp; 
    int x, y, t, k, w; 
    double dk = 2.0*M_PI/(SIZE-1); 
    double dt = M_PI/(SIZE-1); 
    int xPos, yPos; 
    double arg, arg2, arg4; 
    complex<double> arg3; 
    double angle; 
    vector<complexVect> newImg(SIZE, complexVect(SIZE)); 

    for (x = 0; x < SIZE; ++x) { 
     xPos = -127 + x; 
     for (y = 0; y < SIZE; ++y) { 
      yPos = -127 + y; 
      for (t = 0; t < SIZE; ++t) { 
       temp = cmplx; 
       angle = dt * t; 
       arg = xPos * cos(angle) + yPos * sin(angle); 
       for (k = 0; k < SIZE; ++k) { 
        arg2 = -M_PI + dk*k; 
        arg3 = exp(-i * arg * arg2); 
        arg4 = abs(arg) * M_PI/(abs(arg) + M_PI); 
        temp = temp + arg4 * arg3 * phi_k[k][t]; 
       } 
      } 
      newImg[y][x] = temp; 
     } 
    } 
} 

有沒有一種方法可以提高計算時間?我曾嘗試使用以下幫助函數,但它並沒有明顯的幫助。

complex<double> complexexp(double arg) { 
    complex<double> temp (sin(arg), cos(arg)); 
    return temp; 
} 

我使用鐺++編譯我的代碼

編輯:我認爲問題是,我試圖計算複數的事實。如果我只用歐拉公式來計算單獨數組中的實部和虛部並且不必處理複雜類,會更快嗎?

回答

0

最昂貴的函數調用爲罪()/ COS()。我懷疑用複數參數調用exp()會在後臺調用這些函數。

爲了保持精度,函數的計算速度非常緩慢,似乎沒有辦法繞過它。然而,你可以交易準確性的準確性,這似乎是遊戲開發者會做的:sin and cos are slow, is there an alternatve?

0

您可以定義數字e爲常數,並使用std::pow()功能

+0

爲什麼會有所作爲? – Amit

0

我已經與callgrind看看。唯一略有改善(〜1.3%,大小= 50)我能找到的是改變:

temp = temp + arg4 * arg3 * phi_k[k][t]; 

temp += arg4 * arg3 * phi_k[k][t];