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

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

Added original make3d

File size: 2.1 KB
Line 
1function y = blkdiag(varargin)
2%BLKDIAG (overloaded)
3
4% Author Johan Löfberg
5% $Id: blkdiag.m,v 1.1 2006/08/10 18:00:19 joloef Exp $
6
7if nargin<2
8    y=varargin{1};
9    return
10end
11
12% Get dimensions
13n = zeros(nargin,1);
14m = zeros(nargin,1);
15isasdpvar = zeros(nargin,1);
16Symmetric = zeros(nargin,1);
17for i = 1:nargin
18    if isa(varargin{i},'sdpvar')
19        isasdpvar(i) = 1;
20        n(i)=varargin{i}.dim(1);
21        m(i)=varargin{i}.dim(2);
22    else
23        [n(i) m(i)] = size(varargin{i});
24    end
25    Symmetric(i)= issymmetric(varargin{i});
26end
27
28% Find all free variables used
29all_lmi_variables = [];
30for i = 1:nargin
31    all_lmi_variables = [all_lmi_variables getvariables(varargin{i})];
32end
33all_lmi_variables = unique(all_lmi_variables);
34
35% Create an SDPVAR
36y=sdpvar(1,1,'rect',all_lmi_variables,[]);
37
38% Allocate a basis
39nn = 0;
40for i = 1:nargin
41    if isa(varargin{i},'sdpvar')
42        nn = nn+nnz(varargin{i}.basis);
43    else
44        nn = nn+nnz(varargin{i});
45    end
46end
47% We work with transposed basis for speed reasons
48% (still slow though...)
49basis = spalloc(sum(m)*sum(n),1+length(all_lmi_variables),nn)';
50
51% Some indexation tricks
52msums = cumsum([0; m]);
53nsums = cumsum([0; n]);
54summ=sum(m);
55sumn=sum(n);
56indextable = reshape(1:sumn*summ,sumn,summ);
57
58%ix = [];
59%jx = [];
60%sx = [];
61for j = 1:nargin
62    nnindex = indextable(1+nsums(j):nsums(j+1),1+msums(j):msums(j+1));
63    if isasdpvar(j)
64        this_uses = find(ismembc(all_lmi_variables,varargin{j}.lmi_variables));
65        mindex = [1 this_uses+1];
66        basis(mindex(:),nnindex(:)) = varargin{j}.basis';       
67        %      basis(nnindex(:),mindex) = varargin{j}.basis;
68        %[ax,bx,cx] = find(varargin{j}.basis);       
69        %ix = [ix;ax + nsums(j)];
70        %jx = [jx;mindex(bx)]
71        %sx = [sx;cx];
72    else           
73        basis(1,nnindex(:)) = varargin{j}(:)';
74        %[ax,bx,cx] = find(varargin{j});       
75        %ix = [ix;ax + nsums(j)];
76        %jx = [jx;mindex(bx)]
77        %sx = [sx;cx];               
78    end
79end
80y.basis = basis';
81y.dim(1) = sumn;
82y.dim(2) = summ;
83% Reset info about conic terms
84y.conicinfo = [0 0];
85
86
Note: See TracBrowser for help on using the repository browser.