source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/dev/blkdecomp2.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 2.7 KB
Line 
1function blks(p,Q_in,v_in)
2
3% Start by placing blocks in separate matrices
4[v1,dummy1,r1,dummy3]=dmperm(Q_in{1}+eye(length(Q_in{1})));
5for blocks = 1:length(r1)-1
6    i1 = r1(blocks);
7    i2 = r1(blocks+1)-1;   
8    Q{blocks} = Q_in{1}(i1:i2,i1:i2);
9    v{blocks} = v_in{1}(i1:i2);
10    S{blocks} = eye(length(v{blocks}));
11end
12
13pdecomp = 0;
14F = set([]);
15obj = 0;
16
17for blocks = 1:length(Q)
18    if length(Q{blocks})> 1
19        if blocks <= 100
20        [Si,index] = blkOne(Q{blocks});
21        else
22            Si = eye(length(Q{blocks}));
23        end
24    else
25        Si = 1;
26        index = 1;
27    end   
28    Qreduced{blocks} = sdpvar(size(Si,2));
29    F = F + set(Qreduced{blocks} >= 0);
30    S{blocks} = S{blocks}*Si;
31    vi = S{blocks}'*v{blocks};
32    pdecomp = pdecomp + vi'*Qreduced{blocks}*vi;
33    obj = obj + trace(Qreduced{blocks});
34end
35
36solvesdp(F+set(coefficients(p-pdecomp,recover(depends(p))) == 0),obj,sdpsettings('dualize',1));
37
38for i = 1:length(Q)
39    Q{i} = double(Qreduced{i});   
40end
41
42clear ss
43for i = 1:length(Q)
44    ss(i) = norm(Q{i}) > 1e-4;
45end
46Q = {Q{ss}};
47S = {S{ss}};
48v = {v{ss}};
49
50F       
51
52
53function [S,index] = blkOne(T)
54
55s = 1;
56S = [];
57clear v
58for i = 1:size(T,1)
59    for j = i+1:size(T,1)
60        v(i,j) = (T(i,:)*T(j,:)'./(norm(T(i,:))*norm(T(j,:))));%var(T(i,:)./T(j,:))/abs(mean(T(i,:)./T(j,:)));       
61    end
62end
63v = abs((abs(v)-1)) < 1e-6 ;
64
65top = 1;
66S = [];
67remove = [];
68for i = 1:size(T,1)   
69    if any(v(:,i))
70        j = find(v(:,i));
71        for k = 1:length(j)
72            nn = (norm(T(i,:))/norm(T(j(k),:)));
73            s = (T(i,:)*T(j(k),:)'./(norm(T(i,:))*norm(T(j(k),:))));
74            if j(k) <= size(S,2)
75                if S(j(k),j(k))
76            S(i,j(k)) = s*(round(10*nn)/10);
77            S(i,j(k)) = round(S(i,j(k))*10)/10;
78            remove = [remove i];
79                end
80            end
81        end
82    else
83       S(i,i) = 1;
84    end
85end
86       
87S = S(:,any(S,1));
88index = setdiff(1:size(T,2),remove);
89
90TT = T;
91TT(remove,:) = [];
92TT(:,remove) = [];
93S*TT*S' - T
94   
95
96function [Q,v] = prune(Q,v,Qtemp)
97
98for sosfun = 1:length(Q)   
99    keep = diag(Qtemp{sosfun})>tol;
100    Qtemp(:,find(~keep)) = [];
101    Qtemp(find(~keep),:) = [];
102
103    m{sosfun} = m{sosfun}(find(keep));
104
105    Qtemp(abs(Qtemp) < tol) = 0;
106    [v1,dummy1,r1,dummy3]=dmperm(Qtemp+eye(length(Qtemp)));
107    lengths{sosfun} = [];
108    n{sosfun} = {};
109    for blocks = 1:length(r1)-1
110        i1 = r1(blocks);
111        i2 = r1(blocks+1)-1;
112        if i2>i1
113            n{sosfun}{blocks} = m{sosfun}(v1(i1:i2));
114        else
115            n{sosfun}{blocks} = m{sosfun}(v1(i1));
116        end
117        lengths{sosfun} =  [lengths{sosfun}  length(n{sosfun}{blocks})];
118    end
119    lengths{sosfun} = sort(lengths{sosfun});
120end
121
Note: See TracBrowser for help on using the repository browser.