在matlab中加速蒙特卡罗

时间:2014-08-26 19:48:00

标签: performance matlab profile profiler montecarlo

我正在尝试在matlab中加速以下蒙特卡罗模拟:

http://pastebin.com/nS0K7XXa

这是matlab探查器的完整结果

http://i.imgur.com/bGFY5e7.png

我很擅长使用matlab,但是我已经花了很多时间在这上面,我觉得我在某处遗漏了一些东西,因为我觉得这应该跑得快得多。

我很关心剖析器用红色显示的线条......让我们从这些开始:

time  calls      line           code
37.59 19932184   54             radselec = fix(rand(1)*nr) + 1; 
 4.54 19932184   55             nm = nm - 1; 
45.35 19932184   56             Rad2(radselec) = Rad2(radselec) + 1; 

我有一个非常大的向量(Rad2),它保存正整数值,最初它们都是零,但随着模拟的进展,它会填满。

第54行选择该向量的随机元素,每次我向该向量添加一个值我也向变量nr添加一个值,所以基本上nr是numel(nr)fix(rand(1)*nr)+1会随机选择一个数字介于1和nr之间。

问题1:有更好的方法吗?兰德(1)似乎需要很长时间,正如你从第26行看到的那样:

31.50 20540616   26     r = rand(1);

问题2:第56行也引起了我的注意......一旦我有了radselec的值,我需要为Rad2(radselec)的值加上+1。

现在我认为做Rad2(radselec) = Rad2(radselec) + 1;的速度与执行nm = nm - 1或+1的速度一样快......但是探查器显示向向量的元素添加+1是10倍慢。

问题3:

 31.50 20540616   26     r = rand(1); 
                  27     
 22.72 20540616   28     if r > R1/Rt 
  3.39 20220062   29         reacselec = 2; 
 10.80 20220062   30         if r > (R1+R2)/Rt 

rand(1)似乎很慢,因为它......根据定义,我需要0到1之间的随机数。所以我想不出另一种加速排队的方法。

现在......为什么第28行比第30行慢2倍?我的意思是......它们实际上是相同的计算线...如果在分子中有R1 + R2而不是R1,那么第30行应该稍微慢一点。

那里发生了什么?

最后,

 24.26 20540616   79  end     

为什么最终的声明会拖垮这么多时间?怎么解决这个问题?

感谢您的时间,如果这些问题太基础,请抱歉。几个月前我刚刚开始编程,我没有计算机科学背景。我正在考虑参加一些课程,但这不是优先考虑的事情。

非常感谢任何帮助。

0 个答案:

没有答案