加快程序执行[matlab]

时间:2014-12-26 19:40:56

标签: matlab complexity-theory

我想在matlab中运行以下.m文件:

function [relativeErrors] = plotRelativeErrors()

initialPrice = 115.47;
sigma = 1.34*10^(-2);
tau = 0;
days = 40;
Strike = 114;

Time = days/365;
[callSol, ~] = blsprice(initialPrice, Strike, tau, Time, sigma);

termOne = (tau - (sigma^2)/2)*days;
termTwo = sigma * sqrt(days);

relativeErrors = [];
for i = 1:8
    max = 0;
    N = 10^i;
    for n = 1:50
        v = intern_eurValue(Strike, initialPrice, days, N, termOne, termTwo);
        difference = abs(v-callSol);

        if difference > max
            max = difference;
        end
    end
    relativeErrors(end+1) = max;
end

end


function [value] = intern_eurValue(strike, price, days, N, termOne, termTwo)

prices = intern_simulateEndPrice(price, termOne, termTwo, days, N);
theMean = mean(prices);
value = theMean - strike;

if value < 0
    value = 0;
end

end


function [prices] = intern_simPrice(initialPrice, termOne, termTwo, days, N)

prices = [];

for i = 1:N
    termTwo = termTwo * normrnd(0,1);
    exponential = exp(termOne + termTwo);
    prices(end+1,1) = initialPrice * exponential;
end

end

问题是,如果不是更多的话,运行它将花费一天时间来完成计算。我不得不称它在运行14小时后退出并且没有中途完成。我已经尝试通过将大多数静态计算委托给intern_simPriceplotRelativeErrors并通过termOnetermTwo传递结果来优化运行时,但我几乎没有注意到进展。

我不认为这可以减少计算量,但也许它可以切换到计算速度更快的东西。

1 个答案:

答案 0 :(得分:2)

免责声明:以下方法可帮助您达到可用的速度,但不会减少time complexity本身。

如果您的计算速度很慢,首先要做的是使用分析器来找出减慢速度的因素。在您的情况下,intern_simPrice,特别是对normrnd的数百万次调用。

更少的函数调用:

让函数在一次调用中计算多个值通常要快得多。 所以,首先应该替换:

for i = 1:N
    termTwo = termTwo * normrnd(0,1);
    ....
end

X_norm = normrnd(0,1,1,N); % Generate N random values simultaneously
for i = 1:N
    termTwo = termTwo * X_norm(i);
    ....
end

预分配:

如果你知道你的阵列有多长,那么提前分配它们也会更聪明。 所以你应该替换:

prices = []
for i = 1:N
    prices(end+1) = ...

prices = zeros(N,1);
for i = 1:N
    prices(i) = ...

矢量:

有时for循环可以用矢量化版本替换。 在你的情况下,这将是: 完全替换函数intern_simPrice并使用:

prices = initialPrice*exp(termOne + termTwo*cumprod(normrnd(0,1,N,1)));