我想在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;
}
我使用鐺++編譯我的代碼
編輯:我認爲問題是,我試圖計算複數的事實。如果我只用歐拉公式來計算單獨數組中的實部和虛部並且不必處理複雜類,會更快嗎?
在這裏沒有幫助,他使用eulers公式,AFAIK甚至沒有一種方法可以計算出* out *歐拉公式,在這種情況下,他實際上並不觸及exp(),而是用sin(x)代表虛數,cos(x)代表實數。 – snb