2013-12-02 6 views
1

Я пытаюсь выполнить цикл parfor в родительском скрипте для Matlab.Использование Matlab Parfor с 'Eval'

Я хочу рассчитать подразумеваемую волатильность цены опциона, а затем создать новый столбец в существующем наборе данных с результатами.

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

имя = символ (имена (я))

%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 

Проблема возникает с 'Eval()' вычисления в цикле parfor. Mathworks предположил, что я должен превратить весь скрипт в функцию, а затем вызвать функцию в цикле parfor.

В то время как я работаю над этим, любые идеи?

+0

Итак, в чем проблема? Избавление от eval? – sebastian

+0

Да, я пытаюсь избавиться от eval в петле парфоров – BenTam64

ответ

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); 
+0

Хорошо, я попытался реализовать этот подход, но я продолжаю получать эту ошибку: «Попытка ссылки на поле неструктурного массива» – BenTam64

+0

load ('/ главная/Арреат/Казино/names.mat '); % names.mat - это (ячейка 2853 X 1); i = 1; name = char (имена (i)); rows = eval (['length (', name, ')']); named = eval ('name'); parfor n = [1: rows]; BidIV (п, 1) = blsimpv (named.UnderlyingPrice (п), ... named.Strike (п), ... безрисковой/100, ... named.Lifespan (п)/252, ... named.Bid (п) +. 01, ... 10, ... 0, ... 1e-15, ... имени. Тип (n) ... ); конец; Это код – BenTam64

+0

Я решил его использовать, используя ваш подход, Большое спасибо. Ben – BenTam64

Смежные вопросы