Performance 在matlab中加速montecarlo
我试图在matlab中加速以下蒙特卡罗模拟: 这是matlab profiler的全部结果 我对使用matlab非常陌生,但我已经在这方面花了很多时间,我想我遗漏了一些东西,因为我觉得这应该运行得更快 我很担心分析器显示的红色线条当然。。。让我们从以下几点开始:Performance 在matlab中加速montecarlo,performance,matlab,profile,profiler,montecarlo,Performance,Matlab,Profile,Profiler,Montecarlo,我试图在matlab中加速以下蒙特卡罗模拟: 这是matlab profiler的全部结果 我对使用matlab非常陌生,但我已经在这方面花了很多时间,我想我遗漏了一些东西,因为我觉得这应该运行得更快 我很担心分析器显示的红色线条当然。。。让我们从以下几点开始: time calls line code 37.59 19932184 54 radselec = fix(rand(1)*nr) + 1; 4.54 19932184
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:有没有更好的方法?从第26行可以看出,单独使用兰德(1)似乎需要很长时间:
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
兰德(1)似乎是缓慢的,因为它是。。。根据定义,我需要0到1之间的随机数。所以我想不出其他方法来加速排队
现在。。。为什么28号线比30号线慢2倍???我是说。。。它们实际上是同一条线,有着相同的计算。。。如果有什么不同的话,第30行应该稍微慢一点,因为分子中有R1+R2,而不仅仅是R1
那里发生了什么事
最后
24.26 20540616 79 end
为什么那句结束语总是那么刺耳?我们如何解决这个问题
谢谢你抽出时间,如果这些问题太基本,我很抱歉。我几个月前才开始编程,我没有计算机科学背景。我正在考虑修一些课程,但那不是优先考虑的
任何帮助都将不胜感激。您看到的很多都是函数调用开销。这是Matlab,你不能矢量化随机数生成,也就是说,在大的块中分配随机变量吗?我意识到,在某些蒙特卡罗代码中,为了保持可重复性,这可能是一个挑战。如果您想要更快,请将编译为mex
函数。我认为end
只是while
循环条件的代价。谢谢。我试图避免学习如何使用mex编译器,但我想从长远来看,我还是要学习。我将尝试在一个巨大的向量中分配所有的随机数,看看是否这样做。另外,可以肯定的是,没有办法用最后一个结尾来改进这件事,对吗?