我怎样才能加快循环速度?

时间:2017-03-22 21:12:02

标签: matlab performance for-loop

我有以下代码需要很长时间才能运行。我怎么能加快速度呢?

for n = 1:10000;
 syms L_0;
 m(n)=log10(n);
 L_0=max(vpasolve(Equilibrium(L_0,n)==0,L_0));
 L_1(n)=L_0;
end

for i=1:10000;
  q_1(i)=q(L_1(i));
end

plot(m,q_1)

2 个答案:

答案 0 :(得分:1)

在不太了解您正在数值求解的函数的情况下,我将从预先为数组预分配内存开始。对于每次迭代,您要调整内存占用量,这需要等效malloc并将数组复制到新位置以获得递增的大小。有时,如果内存中有足够的空间来增加但不能保证并且不在程序员控制范围内,则可以对此进行优化。

L_1 = zeros(1,100000);
m = zeros(1,100000);
q_1 = zeros(1,100000);

我发现每当我有循环和大向量时,首先要预先分配。下一步是研究数值解算器。这是一个你可以在不调用syms的情况下解决的系统吗?它是PDE系统还是线性方程组?你能利用任何内置的Matlab矩阵函数吗?那些是matlab的面包和黄油,通常很快!

总是值得在其上运行profile viewer并找到瓶颈。在这里很可能是数值解算器,但从来没有伤害过确认。

答案 1 :(得分:0)

同意@Morc,如果您可以重新定义计算以使用矩阵乘法,您将看到令人印象深刻的性能提升。但不知道这些功能,我不知道这是否可能。其他选择:

如果有,请启用并行工具箱并使用parfor。如果您的循环可以使用parfor定义(并非所有都是),这将有所帮助。

最后,您可以在C中重写最耗时的部分(使用分析器来计算出来)并将其编译为MEX函数。 MEX是一个可以从matlab调用的C编译函数。