首页 > 解决方案 > 在 Matlab 中使用 parfor,结构随迭代变化

问题描述

我想用parfor代替forMatlab 重写以下循环。我希望您能帮助了解哪种方法是最好的。

关键是该行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

标签: matlab

解决方案


我建议在循环之外设置所有不变的字段。在循环内部,您可以创建结构的“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

推荐阅读