更快的方法来计算matlab中的bessel函数

时间:2016-08-03 13:54:54

标签: performance matlab bessel-functions

我正在为一个拟合例程编写一个程序,我正在优化代码以便更快地进行计算。弱点是一个部分,我必须计算大量的贝塞尔函数,大约需要0.7秒。在我的情况下,q有177个条目,100和R 400。

  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-Matrix,但计算时间稍长。

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

所以,我想知道,有没有办法更快地计算这些besselfunctions?提前谢谢,kuy

1 个答案:

答案 0 :(得分:0)

Wolfram显示了贝塞尔函数的一个特例,其中函数的第一个参数是0。因此,我们可以预先计算一些变量,如sgn_cumkm2,以简化计算:

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).';
result = bsxfun(@power,z,km2 ) * sgn_cum;

我们可以减少n以加快计算速度,但成本较低。