1 | function 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 | |
---|
7 | if nargin<2 |
---|
8 | y=varargin{1}; |
---|
9 | return |
---|
10 | end |
---|
11 | |
---|
12 | % Get dimensions |
---|
13 | n = zeros(nargin,1); |
---|
14 | m = zeros(nargin,1); |
---|
15 | isasdpvar = zeros(nargin,1); |
---|
16 | Symmetric = zeros(nargin,1); |
---|
17 | for 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}); |
---|
26 | end |
---|
27 | |
---|
28 | % Find all free variables used |
---|
29 | all_lmi_variables = []; |
---|
30 | for i = 1:nargin |
---|
31 | all_lmi_variables = [all_lmi_variables getvariables(varargin{i})]; |
---|
32 | end |
---|
33 | all_lmi_variables = unique(all_lmi_variables); |
---|
34 | |
---|
35 | % Create an SDPVAR |
---|
36 | y=sdpvar(1,1,'rect',all_lmi_variables,[]); |
---|
37 | |
---|
38 | % Allocate a basis |
---|
39 | nn = 0; |
---|
40 | for 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 |
---|
46 | end |
---|
47 | % We work with transposed basis for speed reasons |
---|
48 | % (still slow though...) |
---|
49 | basis = spalloc(sum(m)*sum(n),1+length(all_lmi_variables),nn)'; |
---|
50 | |
---|
51 | % Some indexation tricks |
---|
52 | msums = cumsum([0; m]); |
---|
53 | nsums = cumsum([0; n]); |
---|
54 | summ=sum(m); |
---|
55 | sumn=sum(n); |
---|
56 | indextable = reshape(1:sumn*summ,sumn,summ); |
---|
57 | |
---|
58 | for 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 |
---|
67 | end |
---|
68 | y.basis = basis'; |
---|
69 | y.dim(1) = sumn; |
---|
70 | y.dim(2) = summ; |
---|
71 | % Reset info about conic terms |
---|
72 | y.conicinfo = [0 0]; |
---|
73 | |
---|
74 | |
---|