2016-08-03 79 views
0

即時編寫一個擬合程序的程序,並且目前正在優化代碼以加快計算。 weakes點是一個部分,我必須計算大量的bessel函數,大約需要0.7秒。在我的情況下,q有177個條目,th 100和R 400.在MATLAB中計算貝塞爾函數的更快方法

Js = zeros(numel(th),numel(q)); tR=sin(th')*R; 
    for k = 1:numel(q) 
    Js(:,k) = sum(tn.*besselj(0,q(k)*tR),2); 
    end 

我也嘗試製作3D矩陣,但計算時間稍長。

[Q,T,RR]=meshgrid(q,sin(th),R); 
Js1 = besselj(0,Q.*T.*RR); 

所以,我想知道,有沒有辦法來計算這些besselfunctions更快?由於事先kuy

+0

我不認爲有。您受限於使用內置的「besselj」。 – rayryeng

+0

您是否嘗試過使用'bsxfun'? – flawr

+0

輸入的大小是多少?每個輸入有多少個維度?哪些是向量,又是行向量還是列向量,哪些是較高的昏暗矩陣?告訴我們參賽作品的數量並不能給我們提供這些信息。 – Divakar

回答

0

鎢示出貝塞爾函數的特殊車型情況下函數的第一個參數是0: http://mathworld.wolfram.com/BesselFunctionoftheFirstKind.html

,所以我們可以預先計算一些varables(sgn_cum,平方公里)以simpify計算:

n = 10; 
k = 0 : n; 
sgn_cum = ((-1 * 0.25) .^ k ./ cumprod([1 1:n]).^2)'; 
km2 = 2*k; 

給定的列向量z我們可以得到貝塞爾函數爲:

bsxfun(@power,z,km2) *sgn_cum 

例如:

z= (1:5)'; 
bsxfun(@power,z,km2) *sgn_cum 

我們可以減少N到加速計算但精度降低成本。

+0

嗨,感謝您的回答,我試過了你的功能,但並不是很成功。對於n = 10,建在besselj的速度是其速度的兩倍。值也與besselj一致,直到z = 8左右,然後函數發散。 您發送的鏈接是wolfram,我使用的是matlab,您認爲它們使用相同的算法嗎? – kuy

+0

@kuy,我編輯的代碼運行得更快,請檢查它。來自wolfram的鏈接解釋了理論上的觀點,我不知道這兩個軟件的實現是什麼,我直接從公式實現它。如果n增加可能精度提高 – rahnema1

+0

是的,我知道你的意思(其實它並不重要,matlab使用什麼..),無論如何它的某種功率系列擴展和每一項增加了功能的另一個轉折,但最終它分歧。因爲我需要計算高達2e3的值,所以我認爲這將不是非常有效(即使對於小值,它仍然比besselj慢)..無論如何感謝您的努力! :) – kuy