【问题标题】:Preventing using for loop in MATLAB防止在 MATLAB 中使用 for 循环
【发布时间】:2021-04-21 15:39:29
【问题描述】:

我编写了以下 MATLAB 代码。我想知道如何在不使用 for 循环的情况下对其进行优化。 任何帮助将不胜感激。

MATLAB 代码:

%Some parameters:
s = 50;
k = 50;
r = 0.1;
v = 0.2;
t = 2;
n=10000;

% Calculate CT by calling EurCall function 
CT = EurCall(s, k, r, v, t, n);

%Function EurCall to be called
function C = EurCall(s, k, r, v, t, n)
X = zeros(n,1);
hh = zeros(n,1);

for ii = 1 : n
    X(ii) = normrnd(0, 1);
    SS = s*exp((r - v^2/2)*t + v*X(ii)*sqrt(t));
    hh(ii) = exp(-r*t)*max(SS - k, 0);    
end %end for loop
C = (1/n) * sum(hh); 
end %end function

【问题讨论】:

  • 为什么不想使用循环?有人认为 MATLAB 中的循环很慢,但这种情况已经很多很多年了。这段代码是不是太慢了?这是您计算的瓶颈吗?你真的需要加快速度吗?如果是这样,请寻求加快速度的方法。请不要仅仅删除循环,因为您听说它们很慢!

标签: matlab for-loop optimization


【解决方案1】:

矢量化方法:

这是一种矢量化方法,我认为它复制了与原始脚本相同的功能。这个例子没有循环,而是将X 声明为一个大小为 n 乘以 1 的向量。通过使用逐元素乘法.*,我们可以有效地计算剩余的向量SShh,而无需遍历索引。在这种情况下,SShh 也将是大小为 n 乘 1 的向量。我同意上面的评论,即 MATLAB 的 for 循环不再天生就很慢。

%Some parameters:
s = 50;
k = 50;
r = 0.1;
v = 0.2;
t = 2;
n=10000;

% Calculate CT by calling EurCall function 
[CT] = EurCall(s, k, r, v, t, n);

%Function EurCall to be called
function [C] = EurCall(s, k, r, v, t, n)
X = zeros(n,1);
hh = zeros(n,1);
mu = 0; sigma = 1;

%Creating a vector of normal random numbers of size (n by 1)%
X = normrnd(mu,sigma,[n 1]);
SS = s*exp((r - v^2/2)*t + v.*X.*sqrt(t));
hh = exp(-r*t)*max(SS - k, 0);   
C = (1/n) * sum(hh); 

end %end function

使用 MATLAB R2019b 运行

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2014-11-28
    • 2013-12-21
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多