function F = sdpvar(X) % SDPVAR Converts a block variable to standard SDPVAR % Author Johan Löfberg % $Id: sdpvar.m,v 1.4 2005/06/17 13:02:01 joloef Exp $ % first, check that we have filled everything. [n,m] = size(X.blocks); if n==m % Perform symmetric extension for i = 1:n for j = i+1:n if isempty(X.blocks{i,j}) X.blocks{i,j} = X.blocks{j,i}; elseif isempty(X.blocks{j,i}) X.blocks{j,i} = X.blocks{i,j}'; end end end end for i = 1:n for j = 1:m ns(i,j) = size(X.blocks{i,j},1); ms(i,j) = size(X.blocks{i,j},2); % Indicate zero/eye blocks (simplies code below) if ns(i,j)==1 & ms(i,j) == 1 & isequal(X.blocks{i,j},0) ns(i,j) = 0; ms(i,j) = 0; end end end newns = ns; newms = ms; % Expand missing elements for i = 1:n for j = 1:m if ns(i,j) == 0 ns(i,j) = max(ns(i,:)); end if ms(i,j) == 0 ms(i,j) = max(ms(:,j)); end end end if any(any(ns==0)) | any(any(ms==0)) error('I cannot determine the implied size of some of the blocks'); end F = []; for i = 1:n Y = []; for j = 1:m if isequal(X.blocks{i,j},0) Y = [Y zeros(ns(i,j),ms(i,j))]; elseif isequal(X.blocks{i,j},1) Y = [Y eye(ns(i,j))]; elseif isempty(X.blocks{i,j}) & isempty(X.blocks{j,i}) Y = [Y zeros(ns(i,j),ms(i,j))]; else Y = [Y X.blocks{i,j}]; end end F = [F;Y]; end