📄 sdpvar.m
字号:
sys.extra = [];
% Find zero-variables
constants = find(sys.lmi_variables==0);
if ~isempty(constants);
sys.lmi_variables(constants)=[];
sys.basis(:,1) = sys.basis(:,1) + sum(sys.basis(:,1+constants),2);
sys.basis(:,1+constants)=[];
end
if isempty(sys.lmi_variables)
sys = full(reshape(sys.basis(:,1),sys.n,sys.m));
else
sys = class(sys,'sdpvar');
end
return
case 7 % Fast version for internal use
sys.basis = varargin{5};
sys.lmi_variables=varargin{4};
sys.n = varargin{1};
sys.m = varargin{2};
sys.typeflag = varargin{6};
sys.savedata = [];
sys.extra = varargin{7};
% Find zero-variables
constants = find(sys.lmi_variables==0);
if ~isempty(constants);
sys.lmi_variables(constants)=[];
sys.basis(:,1) = sys.basis(:,1) + sum(sys.basis(:,1+constants),2);
sys.basis(:,1+constants)=[];
end
if isempty(sys.lmi_variables)
sys = full(reshape(sys.basis(:,1),sys.n,sys.m));
else
sys = class(sys,'sdpvar');
end
return
otherwise
error('Wrong number of arguments in sdpvar creation');
end
if isempty(n) | isempty(m)
error('Size must be integer valued')
end;
if ~((abs((n-ceil(n)))+ abs((m-ceil(m))))==0)
error('Size must be integer valued')
end
[mt,variabletype] = yalmip('monomtable');
lmi_variables = (1:nvar)+size(mt,1);
for blk = 1:length(n)
switch matrix_type
case 'full'
basis{blk} = [spalloc(n(blk)*m(blk),1,0) speye(n(blk)*m(blk))];%speye(nvar)];
case 'full complex'
basis = [spalloc(n*m,1,0) speye(nvar/2) speye(nvar/2)*sqrt(-1)];
case 'symm'
if 0
basis = spalloc(n^2,1+nvar,n^2);
l = 2;
an_empty = spalloc(n,n,2);
for i=1:n
temp = an_empty;
temp(i,i)=1;
basis(:,l)=temp(:);
l = l+1;
for j=i+1:n,
temp = an_empty;
temp(i,j)=1;
temp(j,i)=1;
basis(:,l)=temp(:);
l = l+1;
end
end
else
% Hrm...fast but completely f*d up
indicies = reshape(1:n(blk)^2,n(blk),n(blk));
t = tril(indicies);
Y = (t+t')-diag(sparse(diag(t)));
[uu,oo,pp] = unique(Y(:));
basis{blk} = [spalloc(n(blk)^2,1,0) sparse(1:n(blk)^2,pp,1)];
end
case 'symm complex'
basis = spalloc(n^2,1+nvar,2);
l = 2;
an_empty = spalloc(n,n,2);
for i=1:n
temp = an_empty;
temp(i,i)=1;
basis(:,l)=temp(:);
l = l+1;
for j=i+1:n,
temp = an_empty;
temp(i,j)=1;
temp(j,i)=1;
basis(:,l)=temp(:);
l = l+1;
end
end
for i=1:n
temp = an_empty;
temp(i,i)=sqrt(-1);
basis(:,l)=temp(:);
l = l+1;
for j=i+1:n,
temp = an_empty;
temp(i,j)=sqrt(-1);
temp(j,i)=sqrt(-1);
basis(:,l)=temp(:);
l = l+1;
end
end
case 'herm complex'
basis = spalloc(n^2,1+nvar,2);
l = 2;
an_empty = spalloc(n,n,2);
for i=1:n
temp = an_empty;
temp(i,i)=1;
basis(:,l)=temp(:);
l = l+1;
for j=i+1:n,
temp = an_empty;
temp(i,j)=1;
temp(j,i)=1;
basis(:,l)=temp(:);
l = l+1;
end
end
for i=1:n
for j=i+1:n,
temp = an_empty;
temp(i,j)=sqrt(-1);
temp(j,i)=-sqrt(-1);
basis(:,l)=temp(:);
l = l+1;
end
end
case 'skew'
basis = spalloc(n^2,1+nvar,2);
l = 2;
an_empty = spalloc(n,n,2);
for i=1:n
for j=i+1:n,
temp = an_empty;
temp(i,j)=1;
temp(j,i)=-1;
basis(:,l)=temp(:);
l = l+1;
end
end
case 'skew complex'
basis = spalloc(n^2,1+nvar,2);
l = 2;
an_empty = spalloc(n,n,2);
for i=1:n
for j=i+1:n,
temp = an_empty;
temp(i,j)=1;
temp(j,i)=-1;
basis(:,l)=temp(:);
l = l+1;
end
end
for i=1:n
for j=i+1:n,
temp = an_empty;
temp(i,j)=sqrt(-1);
temp(j,i)=-sqrt(-1);
basis(:,l)=temp(:);
l = l+1;
end
end
case 'toep'
basis = spalloc(n^2,1+nvar,2);
an_empty = spalloc(n,1,1);
for i=1:n,
v = an_empty;
v(i)=1;
temp = sparse(toeplitz(v));
basis(:,i+1) = temp(:);
end
% Notice, complex Toeplitz not Hermitian
case 'toep complex'
basis = spalloc(n^2,1+nvar,2);
an_empty = spalloc(n,1,1);
for i=1:n,
v = an_empty;
v(i)=1;
temp = sparse(toeplitz(v));
basis(:,i+1) = temp(:);
end
for i=1:n,
v = an_empty;
v(i)=sqrt(-1);
temp = sparse(toeplitz(v));
basis(:,n+i+1) = temp(:);
end
case 'hank'
basis = spalloc(n^2,1+nvar,2);
an_empty = spalloc(n,1,1);
for i=1:n,
v = an_empty;
v(i)=1;
temp = sparse(hankel(v));
basis(:,i+1) = temp(:);
end
case 'hank complex'
basis = spalloc(n^2,1+nvar,2);
an_empty = spalloc(n,1,1);
for i=1:n,
v = an_empty;
v(i)=1;
temp = sparse(hankel(v));
basis(:,i+1) = temp(:);
end
for i=1:n,
v = an_empty;
v(i)=sqrt(-1);
temp = sparse(hankel(v));
basis(:,n+i+1) = temp(:);
end
case 'rhankel'
basis = spalloc(n^2,1+nvar,2);
an_empty = spalloc(2*n-1,1,1);
for i=1:nvar,
v = an_empty;
v(i)=1;
temp = sparse(hankel(v(1:n),[v(n);v(n+1:2*n-1)]));
basis(:,i+1) = temp(:);
end
case 'rhankel complex'
basis = spalloc(n^2,1+nvar,2);
an_empty = spalloc(2*n-1,1,1);
for i=1:nvar/2,
v = an_empty;
v(i)=1;
temp = sparse(hankel(v(1:n),[v(n);v(n+1:2*n-1)]));
basis(:,i+1) = temp(:);
end
for i=1:nvar/2,
v = an_empty;
v(i)=sqrt(-1);
temp = sparse(hankel(v(1:n),[v(n);v(n+1:2*n-1)]));
basis(:,nvar/2+i+1) = temp(:);
end
otherwise
error('Bug! Report')
end
end
% Update monomtable and pre-calculated variable type
n_mt = size(mt,1);
m_mt = size(mt,2);
if min(lmi_variables)>m_mt % New variables
if size(mt,1)~=size(mt,2)
mt(size(mt,1),size(mt,1))=0;
end
fill=spalloc(size(mt,1),length(lmi_variables),0);
mt=[mt fill;fill' speye(length(lmi_variables))];
else
mt(lmi_variables,lmi_variables) = speye(length(lmi_variables));
end
variabletype(1,size(mt,1)) = 0;
yalmip('setmonomtable',mt,variabletype);
% Create an object
if isa(basis,'cell')
top = 1;
for blk = 1:length(n)
sys{blk}.basis=basis{blk};
nn = size(sys{blk}.basis,2)-1;
sys{blk}.lmi_variables = lmi_variables(top:top+nn-1);
top = top + nn;
sys{blk}.n = n(blk);
sys{blk}.m = m(blk);
sys{blk}.typeflag = 0;
sys{blk}.savedata = [];
sys{blk}.extra = [];
sys{blk} = class(sys{blk},'sdpvar');
end
if length(n)==1
sys = sys{1};
end
else
sys.basis=basis;
sys.lmi_variables = lmi_variables;
sys.n = n;
sys.m = m;
sys.typeflag = 0;
sys.savedata = [];
sys.extra = [];
sys = class(sys,'sdpvar');
end
% Typeflags
% 0 Standard variable
% 1 Inequality (LMI)
% 2 Inequality (element)
% 3 Equality
% 4 Cone
% 5 norm object (osbolete)
% 6 logdet object
% 8 KYP object
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -