如何在MATLAB中实现随机游动仿真的矢量化

如何在MATLAB中实现随机游动仿真的矢量化,matlab,simulation,vectorization,montecarlo,markov-chains,Matlab,Simulation,Vectorization,Montecarlo,Markov Chains,我正在用MATLAB重写蒙特卡罗模拟模型,重点是可读性。该模型涉及许多粒子,用(x,y,z)表示,在一组具有一定终止概率的小状态上随机游走。与输出相关的信息是在给定状态下终止的粒子数 模拟需要足够多的粒子,因此为每个粒子单独运行模拟成本过高。矢量化似乎是从MATLAB中获得性能的一种方法,但是有没有惯用的方法在MATLAB中创建此仿真的矢量化版本 为了实现这一点,我把头撞在墙上——我甚至尝试过创建一个(nStates x nParticle)矩阵来表示每个粒子状态组合,但这种方法在可读性方面很快

我正在用MATLAB重写蒙特卡罗模拟模型,重点是可读性。该模型涉及许多粒子,用(x,y,z)表示,在一组具有一定终止概率的小状态上随机游走。与输出相关的信息是在给定状态下终止的粒子数

模拟需要足够多的粒子,因此为每个粒子单独运行模拟成本过高。矢量化似乎是从MATLAB中获得性能的一种方法,但是有没有惯用的方法在MATLAB中创建此仿真的矢量化版本


为了实现这一点,我把头撞在墙上——我甚至尝试过创建一个(nStates x nParticle)矩阵来表示每个粒子状态组合,但这种方法在可读性方面很快就失去了控制,因为粒子相互独立地从一个状态反弹到另一个状态。我是否应该咬紧牙关,换一种更适合这种情况的语言?

只需像平常一样编写代码即可。几乎所有的matlab函数都可以接受和返回矢量化输入。例如,在一维中模拟N个粒子的布朗运动

position = zeros([N 1]); %start at origin
sigma = sqrt(D * dt); %D is diffusion coefficient, dt is time step
for j = 1:numSteps
    position = position + sigma*randn(size(position));
end
如果您希望每个位置有一个不同的sigma,您可以使sigma成为一个与位置大小相同的向量,并使用“点时间”符号来指示元素对元素的操作

position = position + sigma.*randn(size(position));
如果散射是位置的任意函数和一些随机元素,你只需要写一个矢量化函数,例如

function newstep = step(position)
%diffusion in a overdamped harmonic potential
newstep = -dt*k*position + D*randn(size(position));

for j = 1:numsteps; position = position + step(position);

诸如此类

当你对问题的本质给出如此之少的细节时,很难做出有用的评论。抱歉,为了清晰起见,我试图将其抽象化。我正在模拟光通过有机材料层的传输。每个粒子(光子)都会撞击材质并可以反射或折射。这是由与材料特性和入射角成比例的概率确定的。粒子可以在层内“反弹”。我想知道有多少是整体反映的,有多少是通过的。我通过拍摄许多粒子并追踪它们的路径来实现这一点。问题是,如何将这些路径作为矢量化代码而不是每个粒子的while循环来跟踪。这非常有用。我还有一个问题:在我的例子中,粒子由3D中的速度和层数(整数)表示,即4元组。我需要不同的行为取决于层编号。如何根据元组的第一个元素将示例更改为具有多个函数,并使其保持矢量化?例如,可能有6个“newstep”函数,其选择取决于哪一层。我可以使用上述函数模拟一组移动用户吗。如果是,如何将用户参数(如发射功率和干扰)包括在上述功能中。