Performance 双循环矢量化

Performance 双循环矢量化,performance,matlab,for-loop,vectorization,Performance,Matlab,For Loop,Vectorization,我需要计算一个积分,我的代码是 r=0:25; t=0:250; Ti=exp(-r.^2); T=zeros(length(r),length(t)); for n=1:length(t) w=1/2/t(n); for m=1:length(r) T(m,n)=w*trapz(r,Ti.*exp(-(r(m).^2+r.^2)*w/2).*r.*besseli(0,r(m)*r*w)); end end 目前,计算速度相当快,但我想知道是否有办法将double for循

我需要计算一个积分,我的代码是

r=0:25;
t=0:250;
Ti=exp(-r.^2);
T=zeros(length(r),length(t));
for n=1:length(t)
  w=1/2/t(n);
  for m=1:length(r)
    T(m,n)=w*trapz(r,Ti.*exp(-(r(m).^2+r.^2)*w/2).*r.*besseli(0,r(m)*r*w));
  end
end

目前,计算速度相当快,但我想知道是否有办法将double for循环矢量化并使其更快,尤其是在使用function
trapz

您可以通过将矩阵参数
Y
传递到
trapz(A,Y)
并使用
dim=2
对其进行优化,即循环变为:

r  = 0:25;
t  = 0:250;
Ti = exp(-r.^2);

tic
T  = zeros(length(r),length(t));
for n = 1:length(t)
    w = 1/2/t(n);
    for m = 1:length(r)
        T(m,n) = w*trapz(r,Ti.*exp(-(r(m).^2+r.^2)*w/2).*r.*besseli(0,r(m)*r*w));
    end
end
toc

tic
T1  = zeros(length(r),length(t));
for n = 1:length(t)
    w = 1/2/t(n);
    Y = bsxfun(@times,Ti.*r, exp(-bsxfun(@plus,r'.^2,r.^2)*w/2).*besseli(0,bsxfun(@times,r',r*w)));
    T1(:,n) = w* trapz(r,Y,2);
end
toc

max(abs(T(:)-T1(:)))

您可能可以将其完全矢量化,稍后再查看。

@noir什么bug?数值结果与机床数值精度一致。我得到
max(abs(T(:)-T2(:))=3.4694e-18
其中
T2
是用我的循环计算的。
Ti
r
应该用
repmat
填充,否则尺寸不匹配@Oleg@noir我纠正了这个问题。我使用的是具有自动单例扩展的预发行版(换句话说,bsxfun是自动执行的)