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

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

Added original make3d

File size: 2.4 KB
Line 
1function Z = replace(X,Y,W)
2%REPLACE Substitutes variables
3%
4%Z = REPLACE(Y,X,W)  Replaces any occurence of the SDPVAR object Y
5%                    in the SDPVAR object X with the double W
6%
7% Example
8%  x = sdpvar(1,1);
9%  t = sdpvar(1,1);
10%  Y = [1+t;1+x+t];
11%  Y = replace(Y,x,2) generates Y=[1+t;3+t]
12
13% Author Johan Löfberg
14% $Id: replace.m,v 1.1 2006/08/10 18:00:22 joloef Exp $ 
15
16if ~isa(X,'sdpvar')
17    Z = X;
18    return
19end
20if ~isa(Y,'sdpvar')
21  error('Second arguments must be an sdpvar object')
22end
23if ~is(Y,'linear')
24  error('Second arguments must be linear')
25end
26
27if ~isequal(size(Y),size(W))
28  error('Both arguments must have same size')
29end
30
31if isa(W,'sdpvar')
32    % This is tricky...
33    Z = variable_replace(X,Y,W);
34    return
35end
36
37if ~isa(W,'double')
38  error('Third arguments must be a double')
39end
40
41% Replace with NaN   destroys everything, assume it should be cleared
42W(isnan(W)) = 0;
43
44y_lmi_variables = Y.lmi_variables;
45b = W(:)-Y.basis(:,1);
46A = Y.basis(:,2:end);
47feas_var = A\b;
48if norm(A*feas_var-b)>sqrt(eps)
49  error('Inconsistent assignment')
50end
51
52x_lmi_variables = X.lmi_variables;
53n = X.dim(1);
54m = X.dim(2);
55
56[monomtable,variabletype] = yalmip('monomtable');
57if all(variabletype(x_lmi_variables)==0) % is(X,'linear')
58    Z = X.basis(:,1);
59    for i = 1:length(x_lmi_variables)
60        j = find(x_lmi_variables(i) == y_lmi_variables);
61        if isempty(j)
62            Z = Z + recover(x_lmi_variables(i))*X.basis(:,i+1);
63        else
64            Z = Z + feas_var(j)*X.basis(:,i+1);
65        end
66    end
67else
68    replaced_vars = depends(Y);
69   % used_variables = getvariables(X);
70    used_variables = x_lmi_variables;
71  %  monomtable = yalmip('monomtable');
72    local_monom = monomtable(used_variables,replaced_vars);
73    W = W(:)';
74    gain = zeros(length(used_variables),1);
75    for i = 1:length(used_variables)
76        % F**N 6.5 0^sparse(0) and 0^0 differ
77        gain(i) = prod(W.^full(local_monom(i,:)));
78    end
79
80    local_monoms_left = monomtable(used_variables,:);
81    local_monoms_left(:,replaced_vars) = 0;
82    used_left = find(sum(local_monoms_left,1));
83    base = recovermonoms(local_monoms_left(:,used_left),recover(used_left));
84    base = base.*gain(:);
85    Z = X.basis(:,1);
86    Z = Z + X.basis(:,2:end)*base;
87
88end
89if isa(Z,'sdpvar')
90    Z.dim(1) = n;
91    Z.dim(2) = m;
92    Z.typeflag = X.typeflag;
93    % Reset info about conic terms
94    Z.conicinfo = [0 0];
95else
96    Z = reshape(full(Z),n,m);
97end
98
99
100
101
102
103
104
105
106
Note: See TracBrowser for help on using the repository browser.