[問題] 向量化之後反而變慢?已回收

看板MATLAB作者 (.)時間16年前 (2009/06/14 14:42), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
我要做一個雙重積分, 因為震盪得很厲害, 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
文章代碼(AID): #1AD9kuPI (MATLAB)
文章代碼(AID): #1AD9kuPI (MATLAB)