【问题标题】:Vectorize double for loops向量化双 for 循环
【发布时间】:2016-02-11 21:23:45
【问题描述】:

我需要评估一个积分,我的代码是

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

目前评估速度相当快,但我想知道是否有办法将双 for 循环矢量化并使其更快,尤其是在使用函数 trapz 时。

【问题讨论】:

    标签: performance matlab for-loop vectorization


    【解决方案1】:

    您可以通过将矩阵参数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 什么错误?数值结果与机器数值精度相同。我得到max(abs(T(:)-T2(:))) = 3.4694e-18,其中T2 是用我的循环计算的。
    • Tir 应该用 repmat 填充,否则尺寸不匹配。 @Oleg
    • @noir 我纠正了这个问题。我使用的是具有自动单例扩展的预发行版(换句话说 bsxfun 是自动执行的)
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多