58 lines
1006 B
Mathematica
58 lines
1006 B
Mathematica
|
|
function X=sos2(X,weights,dim)
|
||
|
|
%SOS2 Declare special ordered set of type 2
|
||
|
|
%
|
||
|
|
% F = sos2(p,w,dim)
|
||
|
|
%
|
||
|
|
% Input
|
||
|
|
% p : SDPVAR object
|
||
|
|
% w : Adjacency weights (optional)
|
||
|
|
% dim : Operatate along dim for matrix argument. Default 1
|
||
|
|
%
|
||
|
|
% Output
|
||
|
|
% F : CONSTRAINT object
|
||
|
|
%
|
||
|
|
% See also sos1
|
||
|
|
|
||
|
|
% Normalize arguments
|
||
|
|
if nargin < 3
|
||
|
|
dim = 1;
|
||
|
|
end
|
||
|
|
if nargin < 2
|
||
|
|
weights = [];
|
||
|
|
end
|
||
|
|
|
||
|
|
% Easy fix for column case
|
||
|
|
if dim == 2
|
||
|
|
X = sos2(X',weights);
|
||
|
|
return
|
||
|
|
end
|
||
|
|
if dim > 2
|
||
|
|
error('DIM should be 1 or 2');
|
||
|
|
end
|
||
|
|
|
||
|
|
if length(size(X))>2
|
||
|
|
error('SOS2 not support for nD arrays');
|
||
|
|
end
|
||
|
|
|
||
|
|
% Matrix case by recursive calls
|
||
|
|
if min(size(X))>1
|
||
|
|
Y = [];
|
||
|
|
for i = 1:size(X,1)
|
||
|
|
T.type = '()';
|
||
|
|
T.subs{1} = i;
|
||
|
|
T.subs{2} = ':';
|
||
|
|
Y = [Y;sos2(subsref(X,T),weights)];
|
||
|
|
end
|
||
|
|
X = Y;
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if isempty(weights)
|
||
|
|
X.typeflag = 50;
|
||
|
|
X.extra.sosweights = 1:length(X);
|
||
|
|
else
|
||
|
|
X.typeflag = 50;
|
||
|
|
X.extra.sosweights = findOutWeights(X,weights)
|
||
|
|
end
|
||
|
|
|
||
|
|
X = lmi(X);
|