59 lines
1.2 KiB
Matlab
Executable File
59 lines
1.2 KiB
Matlab
Executable File
function X = ndsdpvar(varargin)
|
|
% NDSDPVAR Constructor for multi-dimensional SDPVAR object
|
|
|
|
% Sometimes it is convenient to cast a 2D SDPVAR variables as an nD
|
|
% variable
|
|
|
|
if nargin == 1 & isa(varargin{1},'sdpvar')
|
|
X = varargin{1};
|
|
X = struct(X);
|
|
X.conicinfo = [0 0];
|
|
X = class(X,'ndsdpvar');
|
|
return
|
|
end
|
|
|
|
type = 'symmetric';
|
|
field = 'real';
|
|
|
|
d = 0;
|
|
i = 1;
|
|
while i<=nargin
|
|
if isa(varargin{i},'double')
|
|
d = d + 1;
|
|
end
|
|
i = i + 1;
|
|
end
|
|
|
|
n = [varargin{1:d}];
|
|
|
|
if nargin > d
|
|
type = varargin{d+1};
|
|
if n(1)~=n(2) & ~isempty(strmatch(type,'symmetric'))
|
|
error('non-square matrix cannot be symmetric');
|
|
end
|
|
else
|
|
if n(1)==n(2)
|
|
type = 'symmetric';
|
|
else
|
|
type = 'full';
|
|
end
|
|
end
|
|
if nargin > d+1
|
|
field = varargin{d+2};
|
|
end
|
|
|
|
v0 = yalmip('nvars');
|
|
X = sdpvar(n(1),n(2),type,field);
|
|
vars = getvariables(X);
|
|
N = prod(n(3:end));
|
|
nNewVars = length(vars)*N;
|
|
usedNewVars = v0+(1:nNewVars);
|
|
appendYALMIPvariables((vars(end)+1):usedNewVars(end));
|
|
|
|
X = struct(X);
|
|
X.dim = n;
|
|
X.basis = [spalloc(size(X.basis,1)*N,1,0) kron(speye(N),X.basis(:,2:end))];
|
|
X.lmi_variables = usedNewVars;
|
|
|
|
X = class(X,'ndsdpvar');
|
|
X = clean(X); |