42 lines
1.4 KiB
Mathematica
42 lines
1.4 KiB
Mathematica
|
|
function varargout = nnz(varargin)
|
||
|
|
%NNZ (overloaded)
|
||
|
|
%
|
||
|
|
% n = nnz(X)
|
||
|
|
%
|
||
|
|
% The NNZ operator is implemented using the concept of nonlinear operators
|
||
|
|
% in YALMIP. NNZ(X) creates a new so called derived variable that can be
|
||
|
|
% treated as any other variable in YALMIP. When OPTIMIZE is issued,
|
||
|
|
% logic constraints are added to the problem to model the NNZ operator.
|
||
|
|
|
||
|
|
switch class(varargin{1})
|
||
|
|
|
||
|
|
case 'sdpvar'
|
||
|
|
% Simple binary vector?
|
||
|
|
if all(ismember(getvariables(varargin{1}),yalmip('binvariables')))
|
||
|
|
if is(varargin{1},'lpcone')
|
||
|
|
varargout{1} = sum(reshape(varargin{1},prod(size(varargin{1})),1));
|
||
|
|
return
|
||
|
|
end
|
||
|
|
end
|
||
|
|
% Nope, more advanced variable.
|
||
|
|
varargout{1} = yalmip('define','nnz',varargin{:});
|
||
|
|
|
||
|
|
case 'char'
|
||
|
|
z = varargin{2};
|
||
|
|
x = varargin{3};
|
||
|
|
switch varargin{1}
|
||
|
|
case 'graph'
|
||
|
|
F = nnz_internal(z,x,0);
|
||
|
|
properties = struct('convexity','convex','monotonicity','none','definiteness','none','model','graph');
|
||
|
|
case {'exact','integer'}
|
||
|
|
F = nnz_internal(z,x,1);
|
||
|
|
properties = struct('convexity','none','monotonicity','none','definiteness','none','model','integer');
|
||
|
|
otherwise
|
||
|
|
error('Unexpected call to NNZ OPERATOR')
|
||
|
|
end
|
||
|
|
varargout{1} = F;
|
||
|
|
varargout{2} = properties ;
|
||
|
|
varargout{3} = x;
|
||
|
|
otherwise
|
||
|
|
end
|