使用Matlab Parfor和'Eval'

时间:2013-12-02 06:05:48

标签: matlab for-loop parallel-processing

我正在尝试在Matlab的父脚本中执行parfor循环。

我想计算期权价格的隐含波动率,然后在预先存在的数据集中创建一个包含结果的新列。

   load('/home/arreat/Casino/names.mat') 

name = char(names(i))

%Loop over n rows to populate columns in dataset named using variable 'name(i)'

rows = eval(['length(',name,')'])

    parfor n=[1:rows]

%Calculate implied volatility using blsimpv(Price, Strike, Rate, Time, Value, Limit,Yield, Tolerance, Class)
BidIV = blsimpv(eval([name,'.UnderlyingPrice(n)']),...
eval([name,'.Strike(n)']),...
RiskFree/100,...
eval([name,'.Lifespan(n)'])/252,...
eval([name,'.Bid(n)'])+.01,...
10,...
0,...
1e-15,...
eval([name,'.Type(n)'])...
 )
eval([name,'.BidIV(n,1) = double(BidIV);']);


%Loop and add implied volatility (BidIV) to a column with n number of
%rows. 

end

问题出现在parfor循环中的'eval()'计算中。 Mathworks建议我将整个脚本变成一个函数,然后在parfor循环中调用该函数。

我在做这个时,有什么想法?

1 个答案:

答案 0 :(得分:1)

不是一直调用eval,而是可以在循环外调用一次,例如data = eval(name),然后在data.Strike循环中使用parfor等。

要避免完全调用eval,请执行以下操作:

 %# load mat-file contents into structure allData, where 
 %# each variable becomes a field
 allData = load('/home/arreat/Casino/names.mat');
 data = allData.(name);