source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/opt/yalmip/extras/milpsubsref.m @ 37

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

Added original make3d

File size: 4.6 KB
Line 
1function varargout = milpsubsref(varargin)
2%MILPSUBSREF
3
4% Author Johan Löfberg
5% $Id: milpsubsref.m,v 1.3 2006/04/27 13:03:15 joloef Exp $
6
7switch class(varargin{1})
8    case 'double'
9        varargin{1} = double(varargin{1});
10        varargin{2}.subs{1} = double(varargin{2}.subs{1});
11        varargout{1} = subsref(varargin{:});
12
13    case 'sdpvar'
14        switch length(varargin{2}.subs)
15            case 1               
16                index = varargin{2}.subs{1};
17                if length(index) > 1
18                    y = [];
19                    for i = 1:length(index)
20                        varargin{2}.subs{1} = index(i);
21                        y = [y;yalmip('addextendedvariable',mfilename,varargin{:})];
22                    end
23                    % Figure out dims of variable
24                    X = randn(size(varargin{1}));
25                    varargin{2}.subs{1} = ones(size(index));
26                    X = subsref(X,varargin{2});
27                    y = reshape(y,size(X,1),size(X,2));
28                    varargout{1} = y;
29                else
30                    varargout{1} = yalmip('addextendedvariable',mfilename,varargin{:});
31                end
32            case 2
33                index1 = varargin{2}.subs{1};
34                index2 = varargin{2}.subs{2};
35                y = [];
36                for i = 1:length(index1)
37                    temp = [];
38                    for j = 1:length(index2)
39                        varargin{2}.subs{1} = index1(i);
40                        varargin{2}.subs{2} = index2(j);
41                        temp = [temp yalmip('addextendedvariable',mfilename,varargin{:})];
42                    end
43                    y = [y;temp];
44                end
45                % Figure out dims of variable
46                X = randn(size(varargin{1}));
47                varargin{2}.subs{1} = ones(size(index1));
48                varargin{2}.subs{2} = ones(size(index2));
49                X = subsref(X,varargin{2});
50                y = reshape(y,size(X,1),size(X,2));
51                varargout{1} = y;
52
53               
54            otherwise
55                error('Only 1D and 2D variable subsref implemented');
56        end
57
58    case 'char'
59        switch varargin{1}
60            case {'graph','milp'}
61                X = varargin{3};
62                Y = varargin{2};
63                if length(varargin{4}.subs) == 1
64                    i = varargin{4}.subs{1};
65                    M = length(X);
66                    m = 1;
67                    F = set(integer(i)); % just to be sure
68                    d = binvar(length(X),1);
69                    [Mx,mx]=derivebounds(X);
70                    for j = m:M
71                        di = d(j);
72%                        F = F + set(mx*(1-di) <= Y-X(j) <= Mx*(1-di));
73                        F = F + set(-(max(Mx)-min(mx))*(1-di) <= Y-X(j) <= (max(Mx)-min(mx))*(1-di));                       
74                        F = F + set(-(1+M-m)*(1-di) <= i-j <= (1+M-m)*(1-di));
75                    end
76                    F = F + set(sum(d)==1);
77                else
78                    i1 = varargin{4}.subs{1};
79                    i2 = varargin{4}.subs{2};
80                    M1 = size(X,1);
81                    M2 = size(X,2);
82                    m1 = 1;
83                    m2 = 1;
84                    if isa(i1,'sdpvar')
85                        F = set(integer(i1)); % just to be sure
86                    end
87                    if isa(i2,'sdpvar')
88                        F = set(integer(i2)); % just to be sure
89                    end
90                    d = binvar(size(X,1),size(X,2),'full');
91                    [Mx,mx]=derivebounds(X);
92                    for i = m1:M1
93                        for j = m2:M2
94                            di = d(i,j);
95                            F = F + set(-(max(Mx)-min(mx))*(1-di) <= Y-X(i,j) <= (max(Mx)-min(mx))*(1-di));
96                            if isa(i1,'sdpvar')
97                                F = F + set(-(1+M1-m1)*(1-di) <= i1-i <= (1+M1-m1)*(1-di));
98                            end
99                            if isa(i2,'sdpvar')
100                                F = F + set(-(1+M2-m2)*(1-di) <= i2-j <= (1+M2-m2)*(1-di));
101                            end
102                        end
103                    end
104                    F = F + set(sum(sum(d))==1);
105                   
106                end
107                varargout{1} = F;
108                varargout{2} = struct('convexity','none','monotonicity','none','definiteness','none');
109                varargout{3} = [X(:);i(:)];
110
111            otherwise
112                error('SDPVAR/ABS called with CHAR argument?');
113        end
114    otherwise
115        error('Strange type on first argument in SDPVAR/ABS');
116end
Note: See TracBrowser for help on using the repository browser.