如何在Matlab中对随机游走模拟进行矢量化

时间:2010-09-24 02:34:46

标签: matlab simulation vectorization montecarlo markov-chains

我正在重写Matlab中的monte carlo仿真模型,重点是可读性。该模型涉及在具有特定终止概率的一小组状态下随机游走之后的许多粒子(表示为(x,y,z))。与输出相关的信息是在给定状态下终止的粒子数。

模拟需要足够的颗粒,为每个颗粒单独运行它是成本过高的。矢量化似乎是从Matlab中获得性能的方法,但是在Matlab中是否有任何惯用的方法来创建这个模拟的矢量化版本?

我正在靠墙攻击以实现这一目标 - 我甚至尝试创建一个代表每个粒子状态组合的nStates x nParticles矩阵,但这种方法很快就会失控(可读性),因为粒子从状态反弹彼此独立地陈述。我应该咬紧牙关并换成更适合这种语言的语言吗?

1 个答案:

答案 0 :(得分:3)

只需像往常一样编写代码即可。几乎所有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相同大小的向量,并使用“dot times”表示法逐个元素操作

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);

等等