[問題] 向量化之後反而變慢?已回收
我要做一個雙重積分, 因為震盪得很厲害, matlab 的 dblquad 等等積分 function
都不太能用.
以下是我的程式 ( 短短的...積分結果是 A )
%%% 這部分事之後會用到的參數..不是我的問題所在. 可跳過%%%
g = 1;
xi = 10;
w = 1;
Interval = 0.001;
Inf1 = 500;
Inf2 = 5;
A = 0;
twopi = 2*pi;
pig = sqrt(pi/g);
coe = 2*pig*i;
div = 1;
%%%%%%%%% method 1: 我目前使用的方法 %%%%%%%%%%%%%%%%%
for x = -Inf1:Interval:(Inf1-Interval); % x 的積分範圍:-500->500
L1 = log(sqrt(pi^2+x.^2)*xi);
L2 = log(pi*xi +i.*x*xi);
ATx = atan(x/pi);
argx = atan(ATx./L1)/2;
LATx = ( L1.^2 + ATx.^2 ).^(1/4);
a = pig ./ LATx .* ( pi.*cos(argx) + x.*sin(argx) );
b = pig ./ LATx .* ( x.*cos(argx) - pi.*sin(argx) );
c = a+b*i;
y = 0 : Interval : Inf2; % y 的積分範圍: 0->5. 向量化
integrand = exp( -y.^2 - 2*c.*y);
d = ( Interval*coe*sum(integrand)/sqrt(L2) - 1/(x-i*pi) ) * ...
exp(twopi*i*x/w) ; % 向量化, 利用 sum, 把 y 積掉.
A = A + Interval*d; % 在 for loop 一個一個加, 把 x 積掉
end
我想說 for loop 比較耗時間.
不如把 iteration 比較多次的 x 向量化, 而讓 iteration 比較少次的
y 跑 for loop.
於是改成
%%%%%%%% method 2 %%%%%%%%%%%%%%
x = -Inf1:Interval:(Inf1-Interval); % x 向量化
L1 = log(sqrt(pi^2+x.^2)*xi);
L2 = log(pi*xi +i.*x*xi);
ATx = atan(x/pi);
argx = atan(ATx./L1)/2;
LATx = ( L1.^2 + ATx.^2 ).^(1/4);
c = pig ./ LATx .* ( ( pi.*cos(argx) + x.*sin(argx) ) +...
i*( x.*cos(argx) - pi.*sin(argx) ) );
for y = 0 : Interval : Inf2; % 算 y for loop
integrand = exp( -y.^2 - 2.*c.*y + twopi*i.*x/w )./sqrt(L2);
A = A + Interval*Interval*coe*sum(integrand);
end
A = A - sum( exp(twopi*i.*x/w)./(x-i*pi))*Interval;
結果...
method 2 的速度竟然遠遠慢於 method 1.
之後, 我又嘗試使用 meshgrid. 但是由於 memory siz 限制, 所以
切成一塊一塊來做. 也是比 method 1 慢.
這是怎一回事?
向量化反而慢了...
有人說 matlab 對於長矩陣的向量化並沒有加速功能, 是這樣嗎?
如果是, why? 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 24.250.232.228
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章