Проблема использования пользовательских объектов в цикле parfor
Я довольно плохо знаком с параллельными вычислениями в MATLAB и столкнулся со следующей проблемой: у меня есть следующий скрипт, вызывающий итеративную функцию оптимизации
trials = cell2struct([ ...
{ 4 5 6 7 10 16 17 18 23 24}; ...
{ 0.5 1 0.5 0 0 0.5 0.5 0.5 0.5 0}; ...
{ 0 0 pi pi 0 pi-pi/6 -pi/6 pi/6 pi+pi/6 pi/6}; ...
{0.0458 0.0440 0.0510 0.0312 0.0464 0.0449 0.0461 0.0598 0.0598 0.0511} ], ...
{'idx', 'mounting', 'q5_0', 'dq4_squared'}, 1);
coeff = [2, 10.5, 20, 25, 2.5];
while < some_stop_condition >
[coeff, fval] = fminunc(@(x) EvaluateIndex(x, trials), coeff);
end
У меня есть рабочая последовательная версия функции EvaluateIndex
, но так как для выполнения вычислений требуется очень много времени, я бы хотел переключиться на параллельную версию. Упрощенная версия "распараллеленной" целевой функции EvaluateIndex
как следует:
function MeanSquaredError = EvaluateIndex(coeff, configs)
% Simulation time
dT = 0.01; % Time step [s]
T_final = 60; % Duration [s]
% Wave characteristics
wave = SeaWave( < sea_wave_params > );
% Vehicle settings
for i = 1:length(configs)
vehicle(i) = PrototypeWAVE( < vehicle_i_params > );
end
dq4_squared = zeros(1, length(configs));
tic
parfor i = 1:length(configs)
% Initial conditions
q1_0 = 0;
q2_0 = 0;
q3_0 = 0;
q4_0 = pi/2;
q5_0 = configs(i).q5_0;
q_0 = [ q1_0+1.3*(1-cos(q3_0)), q2_0+1.3*sin(q3_0), q3_0, q4_0, q5_0 ]';
dq_0 = [ 0, 0, 0, 0, 0 ]';
% Run simulation
[~, Results] = Run(vehicle(i), wave, [q_0; dq_0], dT, T_final);
% Get results
dq4_squared(i) = mean(Results(:,9).^2);
end
toc
MeanSquaredError = sum( (dq4_squared - horzcat(configs.dq4_squared)).^2 );
end
Вот, SeaWave
а также PrototypeWAVE
два класса, и функция Run
это метод PrototypeWAVE
учебный класс. Согласно некоторым предположениям, я определил объекты этих классов вне parfor
петля; однако, когда я пытаюсь запустить скрипт, я получаю следующие предупреждения:
Warning: Element(s) of class 'SeaWave' do not match the current constructor definition. The element(s) have been converted to structures.
Warning: Element(s) of class 'PrototypeWAVE' do not match the current constructor definition. The element(s) have been converted to structures.
и эта ошибка:
Error using EvaluateIndex (line 75)
Cannot find an exact (case-sensitive) match for 'Run'
The closest match is: run in /Applications/MATLAB_R2016b.app/toolbox/matlab/lang/run.m
Похоже, что MATLAB не распознает существование классов и их методов. Я уже пытался добавить строку addAttachedFiles(gcp, {'./@SeaWave', './@PrototypeWAVE'})
перед parfor
петля, но ничего не меняется.
Я использую MATLAB R2016b на MACOS.
Любая помощь очень ценится. заранее спасибо