【问题标题】:Using Matlab Parfor with 'Eval'使用带有“评估”的 Matlab Parfor
【发布时间】:2013-12-17 18:43:27
【问题描述】:

我正在尝试在 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 循环中调用该函数。

我在做这件事时,有什么想法吗?

【问题讨论】:

  • 那么,问题出在哪里?摆脱评估?
  • 是的,我正试图摆脱 parfor 循环中的 eval

标签: matlab for-loop parallel-processing


【解决方案1】:

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

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

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

【讨论】:

  • 好的,我尝试实现这种方法,但我不断收到此错误:“尝试引用非结构数组的字段”
  • load('/home/arreat/Casino/names.mat'); %names.mat 是一个(2853 X 1 单元格);我 = 1;名称 = 字符(名称(i)); rows = eval(['length(',name,')']);命名 = eval('name'); parfor n=[1:rows]; BidIV(n,1) = blsimpv(named.UnderlyingPrice(n),...named.Strike(n),...RiskFree/100,...named.Lifespan(n)/252,...named. Bid(n)+.01,... 10,... 0,... 1e-15,... named.Type(n)...);结尾;这是代码
  • 我用你的方法解决了,非常感谢。本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
  • 2020-05-22
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多