我正在为一个拟合例程编写一个程序,我正在优化代码以便更快地进行计算。弱点是一个部分,我必须计算大量的贝塞尔函数,大约需要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
答案 0 :(得分:0)
Wolfram显示了贝塞尔函数的一个特例,其中函数的第一个参数是0
。因此,我们可以预先计算一些变量,如sgn_cum
和km2
,以简化计算:
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
以加快计算速度,但成本较低。