Matlab - 如何最佳地将1/1的1到1E10系列加起来(在几分钟内) - matlab减速

时间:2015-01-25 20:25:44

标签: performance matlab loops for-loop

我的matlab有问题。我需要将数学系列1 / x从1到1E10相加。我在Matlab中有一些包含循环的代码 - 第一步循环步骤非常快,但是在循环的第二步它减速并且Matlab几乎冻结,所以我无法在适当的时间计算出来。

你能帮我解决这个问题吗?

对于较小的范围,它可以正常工作(例如1E06),但我需要计算整个范围。我试图分开到更小的范围,但仍然有循环和matlab非常慢。

看起来像matlab和for循环的问题,这会慢下来。在第一个循环步骤之后,RAM已满,但对于第二个循环步骤,RAM仍然已满,因此速度变慢。我不知道为什么Matlab没有释放RAM。

感谢您的帮助!

弗拉基米尔

1 个答案:

答案 0 :(得分:4)

您想要获得1e10-th harmonic number。在符号工具箱中有一个函数,称为harmonic,它的速度非常快:

>> format long %// to see more decimals
>> n = 1e10;
>> harmonic(n)
ans =
  23.603066594891992

它如此之快的原因是harmonic函数利用了relationshipEuler-Mascheroni constant之间的digamma function

enter image description here
其中“psi”是digamma函数, H n n 次谐波数,“gamma” “是Euler-Mascheroni常数。所以你也可以使用

>> n = 1e10;
>> vpa(psi(n+1) + eulergamma)
ans =
    23.603066594891987434787570068504

如果您没有符号工具箱,您仍然可以:

>> g = 0.5772156649015328606065120900824; %// Euler-Mascheroni constant
>> n = 1e10;
>> psi(n+1) + g
ans =
  23.603066594891988