1 | function setduals(F,D_struc,K) |
---|
2 | |
---|
3 | D_struc = full(D_struc); |
---|
4 | if ~isempty(D_struc) |
---|
5 | |
---|
6 | % Equality constraints might have been converted |
---|
7 | % to inequalities |
---|
8 | if isfield(K,'fold') |
---|
9 | D_struc = [-D_struc(1:K.fold)+D_struc(1+K.fold:2*K.fold);D_struc(2*K.fold+1:end)]; |
---|
10 | K.f = K.fold; |
---|
11 | K.l = K.l-2*K.fold; |
---|
12 | end |
---|
13 | |
---|
14 | Z = dual2cell(D_struc,K); |
---|
15 | |
---|
16 | Finfo = lmiinfo(F); |
---|
17 | lmi_index = []; |
---|
18 | j=1; |
---|
19 | |
---|
20 | if ~isempty(Finfo.sdp) |
---|
21 | for i = 1:size(Finfo.sdp,1) |
---|
22 | lmi_index = [lmi_index;Finfo.sdp(i,3)]; |
---|
23 | duals{j}=(Z.s{i}+Z.s{i}')/2;j = j+1; |
---|
24 | end |
---|
25 | end |
---|
26 | |
---|
27 | if ~isempty(Finfo.soc) |
---|
28 | for i = 1:size(Finfo.soc,1) |
---|
29 | lmi_index = [lmi_index;Finfo.soc(i,3)]; |
---|
30 | duals{j}=Z.q{i};j = j+1; |
---|
31 | end |
---|
32 | end |
---|
33 | |
---|
34 | if ~isempty(Finfo.rlc) |
---|
35 | for i = 1:size(Finfo.rlc,1) |
---|
36 | lmi_index = [lmi_index;Finfo.rlc(i,3)]; |
---|
37 | duals{j}=Z.r{i};j = j+1; |
---|
38 | end |
---|
39 | end |
---|
40 | |
---|
41 | if ~isempty(Finfo.lin) |
---|
42 | top=1; |
---|
43 | for i = 1:size(Finfo.lin,1) |
---|
44 | lmi_index = [lmi_index;Finfo.lin(i,3)]; |
---|
45 | duals{j}=reshape(Z.l(top:top+Finfo.lin(i,1)*Finfo.lin(i,2)-1),Finfo.lin(i,1),Finfo.lin(i,2));j = j+1; |
---|
46 | top = top+Finfo.lin(i,1)*Finfo.lin(i,2); |
---|
47 | end |
---|
48 | end |
---|
49 | if ~isempty(Finfo.equ) |
---|
50 | top=1; |
---|
51 | for i = 1:size(Finfo.equ,1) |
---|
52 | lmi_index = [lmi_index;Finfo.equ(i,3)]; |
---|
53 | duals{j}=reshape(Z.f(top:top+Finfo.equ(i,1)*Finfo.equ(i,2)-1),Finfo.equ(i,1),Finfo.equ(i,2));j = j+1; |
---|
54 | top = top+Finfo.equ(i,1)*Finfo.equ(i,2); |
---|
55 | end |
---|
56 | end |
---|
57 | |
---|
58 | if ~isempty(lmi_index) |
---|
59 | yalmip('setdual',lmi_index,duals); |
---|
60 | end |
---|
61 | |
---|
62 | end |
---|