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

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

Added original make3d

File size: 2.6 KB
Line 
1function dfdx = shadowjacobian(f,x)
2% See SDPVAR/jacobian
3
4% Author Johan Löfberg
5% $Id: shadowjacobian.m,v 1.6 2005/05/10 15:04:52 joloef Exp $
6
7if nargin==1
8    if isa(f,'sdpvar')
9        x = recover(depends(f));
10    else
11        x = 0;
12    end
13else
14    if length(getvariables(x))<length(x)
15        error('x should be a vector of scalar independant variables');
16    end
17end
18
19if isa(f,'double')
20    dfdx = zeros(size(f,1),length(x));
21end
22
23[n,m]=size(f);
24
25if m>1
26   error('Jacobian only defined for column vectors.')
27end
28
29if n*m==1
30    dfdx = scalar_jacobian(f,x);
31    % Argh, fix this (sorts inside scalar_jacobian   
32    for i = 1:length(x)
33        var(i,1)=getvariables(x(i));
34    end
35    [i,j]=sort(var);
36    dfdx = dfdx(1,j);
37    return
38   
39else
40    dfdx = [];
41    AllVars = recover(unique([depends(f) getvariables(x)]));
42
43    for i = 1:length(f)
44        dfdx = [dfdx;scalar_jacobian(f(i),x,AllVars)];
45    end
46    % Argh, fix this (sorts inside scalar_jacobian
47    for i = 1:length(x)
48        var(i,1)=getvariables(x(i));
49    end
50    [i,j]=sort(var);
51    dfdx = dfdx(:,j);
52end
53
54function [dfdx,dummy] = scalar_jacobian(f,x,AllVars)
55
56% Aaaaaah, horrible code. FIX!
57
58if isa(f,'double')
59    dfdx = zeros(1,length(x));
60    return
61end
62
63if nargin==2
64    AllVars = recover(uniquestripped([depends(f) getvariables(x)]));
65end
66
67exponent_p = exponents(f,AllVars);
68
69coefficients = getbase(f);
70coefficients = coefficients(2:end);
71coefficients = coefficients(:);
72if nnz(exponent_p(1,:))==0
73    exponent_p=exponent_p(2:end,:);
74end
75
76x_variables = getvariables(x);
77AllVars_variables = getvariables(AllVars);
78%AllDeriv = [];
79AllDeriv2 = [];
80for k = 1:length(x)
81    wrt = find(ismembc(AllVars_variables,x_variables(k)));
82    deriv = exponent_p;
83    deriv(:,wrt) = deriv(:,wrt)-1;   
84   % AllDeriv = [AllDeriv;deriv];
85    keep{k} = find(deriv(:,wrt)~=-1);
86    AllDeriv2 = [AllDeriv2;deriv(keep{k},:)];       
87end
88
89if size(AllDeriv2,1)==0
90    dummy = 1;
91else
92    dummy = recovermonoms(AllDeriv2,AllVars);
93end
94
95top = 1;
96dfdx=[];
97for k = 1:length(x)
98    wrt = find(ismembc(AllVars_variables,x_variables(k)));   
99    m = length(keep{k});
100    if m>0
101        poly = sum((coefficients(keep{k}(:)).*exponent_p(keep{k}(:),wrt)).*dummy(top:top+m-1),1);
102        top = top + m;
103    else
104        poly = 0;
105    end
106%         %else
107%         %    poly = 0;
108%         %end
109%         tip = tip + LengthUsed{k};%size(exponent_p,1);
110%     end
111    %j = find(AllDeriv(top:top+size(exponent_p,1)-1,wrt)~=-1);
112    %if ~isempty(j)
113    %    poly = sum(coefficients(j).*exponent_p(j,wrt).*dummy(top+j-1));
114    %else
115    %    poly = 0;
116    %end
117    %top = top + size(exponent_p,1);
118
119    dfdx = [dfdx ; poly];
120end
121dfdx = dfdx';
Note: See TracBrowser for help on using the repository browser.