Performance 在matlab中加速montecarlo

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

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

这是matlab profiler的全部结果

我对使用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:有没有更好的方法?从第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编译器,但我想从长远来看,我还是要学习。我将尝试在一个巨大的向量中分配所有的随机数,看看是否这样做。另外,可以肯定的是,没有办法用最后一个
结尾来改进这件事,对吗?