我正在尝试在matlab中加速以下蒙特卡罗模拟:
这是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
为什么最终的声明会拖垮这么多时间?怎么解决这个问题?
感谢您的时间,如果这些问题太基础,请抱歉。几个月前我刚刚开始编程,我没有计算机科学背景。我正在考虑参加一些课程,但这不是优先考虑的事情。
非常感谢任何帮助。