[37] | 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 | |
---|