matlab循环矢量化 嵌套,matlab – Octave:这些FOR循环如何被矢量化?

由于迭代之间依赖于获取每个新列相对于前一列的结果,似乎您需要至少一个循环,但是以矢量化方式在列中执行所有操作,这可能会为您加速.两个嵌套循环的矢量化替换看起来像这样 –

Prices(:,1)=S0;

for j = 2:n+1

Prices(:,j) = Prices(:,j-1).*dlns(:,j);

endfor

我刚刚想到可以通过cumprod来处理依赖关系,它可以让我们获得累积产品,而这些产品基本上是在这里完成的,因此会导致无循环解决方案!这是实施 –

Prices = [repmat(S0,nIter,1) cumprod(dlns(:,2:end),2)*S0]

在MATLAB上进行基准测试

基准代码 –

%// Parameters as told by OP and then create the inputs

nIter= 100000;

n = 100;

adj_r = 0.03;

sigma = 0.2;

dt = 1/n;

S0 = 60;

e = norminv(rand(nIter,n));

dlns = cat(2, ones(nIter,1), exp((adj_r+0.5*sigma^2)*dt+sigma*e.*sqrt(dt)));

disp('-------------------------------------- With Original Approach')

tic

Prices = zeros(nIter, n+1);

for i = 1:nIter

for j = 1:n+1

if j == 1

Prices(i,j)=S0;

else

Prices(i,j)=Prices(i,j-1)*dlns(i,j);

end

end

end

toc, clear Prices

disp('-------------------------------------- With Proposed Approach - I')

tic

Prices2(nIter, n+1)=0; %// faster pre-allocation scheme

Prices2(:,1)=S0;

for j = 2:n+1

Prices2(:,j)=Prices2(:,j-1).*dlns(:,j);

end

toc, clear Prices2

disp('-------------------------------------- With Proposed Approach - II')

tic

Prices3 = [repmat(S0,nIter,1) cumprod(dlns(:,2:end),2)*S0];

toc, clear Prices3

运行时结果 –

-------------------------------------- With Original Approach

Elapsed time is 0.259054 seconds.

-------------------------------------- With Proposed Approach - I

Elapsed time is 0.020566 seconds.

-------------------------------------- With Proposed Approach - II

Elapsed time is 0.067292 seconds.

现在,运行时确实表明第一个提出的方法可能更适合这里!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值