performance - 加速嵌套 for 循环

标签 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

在我看来,它并没有真正提高性能。你怎么看这件事?

你介意点一盏灯吗?

先谢谢你了。

编辑

我将介绍一些涉及我的问题的理论背景。 一般情况下,beta的计算方式如下

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)

最佳答案

这是另一种方法,并行化,因为使用 spmdparfor 很容易。考虑 quad 而不是 integral,请参阅 link例如...

关于performance - 加速嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14428190/

相关文章:

database - 计算过载时的数据库性能

java - Controller有很多@Autowired服务

performance - Amazon 的微型实例(Linux、64 位)适合 MongoDB 服务器吗?

performance - Haskell:映射长度。组比显式递归慢得多吗?

matlab - 在matlab中查找矩阵所有列之间的公共(public)元素

matlab - 根据元胞数组中的内容查找列索引

matlab - 从开始/结束索引列表创建矢量化数组

Java 自动矢量化示例

python - 使这个 C 数组处理代码更像 python(甚至是 numpy)

matlab - 在matlab中用数字随机数创建矩阵