向量化 for 循环操作

Vectorizing a for-loop operation

我有一个 SDE,我正在使用以下代码通过数值方案进行近似:

mu = 1.5;
Sigma = 0.5;
TimeStep = 0.001;
Time = 0:TimeStep:5;
random1 = normrnd(2,0.05,[1,500]);
random2 = randn(1,length(Time));
X = zeros(500, length(Time));

for j = 1:500
   X(j,1)= random1(j);
   for i = 1:length(Time)
        X(j,i+1) = X(j,i) - mu*X(j,i)*TimeStep + Sigma*sqrt(2*mu)*sqrt(TimeStep)*random2(i);
   end
end

如何才能删除外部 for 循环并进行矢量化,以便在每个时间步为所有 500 个绘图计算第一个值?

这很简单,尤其是 j 仅用于此处的行索引:

X(:,1)= random1;
for i = 1:length(Time)
    X(:,i+1) = X(:,i) - mu*X(:,i)*TimeStep + Sigma*sqrt(2*mu)*sqrt(TimeStep)*random2(i);
end

我测试了两个版本 (Octave 5.1.0),得到了相同的结果。在我的机器上加速大约是 400 倍。

一般说明:切勿将i and/or j用作循环变量,因为它们也用作虚数单位,请参见。 i and j.

希望对您有所帮助!