Использование parfor в Matlab со структурой, изменяющейся на протяжении итерации - PullRequest
0 голосов
/ 16 ноября 2018

Я хотел бы переписать следующий цикл, используя parfor вместо for в Matlab. Я хотел бы, чтобы ваша помощь поняла, какой путь лучше всего продолжить.

Ключевым моментом является то, что строка result=gurobi(model) хочет структуру в качестве входных данных и разбивает структуру. Два поля структуры model меняются в зависимости от итерации. Я предполагаю, что должен каким-то образом предварительно выделить структуру model, состоящую из 100 подструктур, но я не могу пойти дальше, и я был бы признателен за вашу помощь.

Обратите внимание: все переменные, используемые в этом цикле, создаются где-то еще. Я не включил эту часть кода.

L=zeros(100,1)
for b=1:100
    model.A=[Aineq; Aeq];
    model.rhs=[bineq;beq]; 
    model.sense=[repmat('<', size(Aineq,1),1); repmat('=', size(Aeq,1),1)];
    model.Q=Qsub{b}; %VARYING WITH b
    model.obj=csub{b}; %VARYING WITH b
    model.vtype=type; 
    model.lb=total_lb;
    model.ub=total_ub;
    result=gurobi(model); 
    L(b)=(result.objval+alphasub{b})*B;
end

1 Ответ

0 голосов
/ 17 ноября 2018

Я рекомендую установить все неизменяемые поля вне цикла. Внутри цикла вы можете создать копию структуры local_model и вставить любое из изменяющихся полей. Это позволит вам использовать цикл parfor.

Попробуйте что-то похожее на следующее:

model.A=[Aineq; Aeq];
model.rhs=[bineq;beq]; 
model.sense=[repmat('<', size(Aineq,1),1); repmat('=', size(Aeq,1),1)];
model.vtype=type; 
model.lb=total_lb;
model.ub=total_ub;

L=zeros(100,1)
parfor b=1:100
    local_model = model;
    local_model.Q=Qsub{b}; %VARYING WITH b
    local_model.obj=csub{b}; %VARYING WITH b

    result=gurobi(local_model); 
    L(b)=(result.objval+alphasub{b})*B;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...