加快嵌套for循环

时间:2013-01-20 19:12:13

标签: performance matlab vectorization

我一直在努力加快以下功能,但没有结果:

function beta = beta_c(k,c,gamma)
beta = zeros(size(k));
E = @(x) (1.453*x.^4)./((1 + x.^2).^(17/6));
for ii = 1:size(k,1)
    for jj = 1:size(k,2)
        E_int = integral(E,k(ii,jj),10000);
        beta(ii,jj) = c*gamma/(k(ii,jj)*sqrt(E_int));
    end
end
end

到目前为止,我用这种方式解决了这个问题:

function beta = beta_calc(k,c,gamma)
k_1d = reshape(k,[1,numel(k)]);
E_1d =@(k) 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int = zeros(1,numel(k_1d));
parfor ii = 1:numel(k_1d)
E_int(ii) = quad(E_1d,k_1d(ii),10000);
end
beta_1d = c*gamma./(k_1d.*sqrt(E_int));
beta = reshape(beta_1d,[size(k,1),size(k,2)]);
end

对我而言,它并没有真正提升表现。你怎么看待这个?

你想介绍一下吗?

我提前感谢你。

修改

我将介绍一些涉及我的问题的理论背景。 通常,β计算如下

enter image description here

因此,在一维k阵列的简化情况下,E_int可以计算为

E = 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int = 1.5 - cumtrapz(k,E);

或者,作为

E_int(1) = 1.5;
for jj = 2:numel(k)
E =@(k) 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int(jj) = E_int(jj - 1) - integral(E,k(jj-1),k(jj));
end

尽管如此,k目前是一个矩阵k(size1,size2)

2 个答案:

答案 0 :(得分:2)

我喜欢这个问题。

问题:函数integral仅作为集成限制标量。因此,很难对E_int的计算进行矢量化。

一条线索:相同的功能从k(ii,jj)反复集成到无限......似乎有很多冗余...

建议的解决方案:如何将k的值从最小值排序到最大值,并将E_sort_int(si) = integral( E, sortedK(si), sortedK(si+1) );sortedK( numel(k) + 1 ) = 10000;集成。然后是E_int = cumsum( E_sort_int );的完整值(您只需要“撤消”排序并将其重新整形为k的大小)。

答案 1 :(得分:2)

这是另一种方法,并行化,因为使用spmdparfor很容易。不要integral考虑quad,请参阅此link以获取示例...