我正在运行蒙特卡罗模拟来计算Y,例如: Y(i,j + 1)= Y(i,j)* a(i,j)+ b
我想尽可能避免使用for循环,而是使用矩阵计算,因为它是Matlab的优势。
这是我的代码:
kappa = 6.21;
theta = 0.019;
sigma = 0.61;
rho = -0.7;
r = 0.0319;
V0 = 0.010201;
T = 1;
N = 300; % Time steps
M = 1e6; % Number of simulations
dt = T/N;
Z = randn(M,N);
a = kappa*dt+sigma*sqrt(dt);
b = kappa*theta*dt;
% With loop
tic
y = zeros(M,N); % preallocate
y(:,1) = V0; % initial value
for i=1:M
for j = 1:N
y(i,j+1) = y(i,j)*(1-a*Z(i,j))+b;
end
end
toc
这是我整个代码的一小部分,单独运行给定参数需要65秒。有没有办法让它更快,通过矩阵计算而不是循环?谢谢
答案 0 :(得分:2)
似乎,每列都依赖于除第1列之外的先前列值。因此,您可以通过执行类似以下操作来摆脱第一个for循环:
for j=2:N
y(:,j) = y(:,j-1).*(1-a*Z(:,j-1)) + b;
end
这个减少了近一半的时间。