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

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

Added original make3d

File size: 1.7 KB
Line 
1function y = blkdiag(varargin)
2%BLKDIAG (overloaded)
3
4% Author Johan Löfberg
5% $Id: blkdiag.m,v 1.7 2006/10/20 11:49:26 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
58for j = 1:nargin
59    nnindex = indextable(1+nsums(j):nsums(j+1),1+msums(j):msums(j+1));
60    if isasdpvar(j)
61        this_uses = find(ismembc(all_lmi_variables,varargin{j}.lmi_variables));
62        mindex = [1 this_uses+1];
63        basis(mindex(:),nnindex(:)) = varargin{j}.basis';               
64    else           
65        basis(1,nnindex(:)) = varargin{j}(:)';                 
66    end
67end
68y.basis = basis';
69y.dim(1) = sumn;
70y.dim(2) = summ;
71% Reset info about conic terms
72y.conicinfo = [0 0];
73
74
Note: See TracBrowser for help on using the repository browser.