2016-08-03 195 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