📄 milpsubsref.m
字号:
function varargout = milpsubsref(varargin)
%MILPSUBSREF
% Author Johan L鰂berg
% $Id: milpsubsref.m,v 1.3 2006/04/27 13:03:15 joloef Exp $
switch class(varargin{1})
case 'double'
varargin{1} = double(varargin{1});
varargin{2}.subs{1} = double(varargin{2}.subs{1});
varargout{1} = subsref(varargin{:});
case 'sdpvar'
switch length(varargin{2}.subs)
case 1
index = varargin{2}.subs{1};
if length(index) > 1
y = [];
for i = 1:length(index)
varargin{2}.subs{1} = index(i);
y = [y;yalmip('addextendedvariable',mfilename,varargin{:})];
end
% Figure out dims of variable
X = randn(size(varargin{1}));
varargin{2}.subs{1} = ones(size(index));
X = subsref(X,varargin{2});
y = reshape(y,size(X,1),size(X,2));
varargout{1} = y;
else
varargout{1} = yalmip('addextendedvariable',mfilename,varargin{:});
end
case 2
index1 = varargin{2}.subs{1};
index2 = varargin{2}.subs{2};
y = [];
for i = 1:length(index1)
temp = [];
for j = 1:length(index2)
varargin{2}.subs{1} = index1(i);
varargin{2}.subs{2} = index2(j);
temp = [temp yalmip('addextendedvariable',mfilename,varargin{:})];
end
y = [y;temp];
end
% Figure out dims of variable
X = randn(size(varargin{1}));
varargin{2}.subs{1} = ones(size(index1));
varargin{2}.subs{2} = ones(size(index2));
X = subsref(X,varargin{2});
y = reshape(y,size(X,1),size(X,2));
varargout{1} = y;
otherwise
error('Only 1D and 2D variable subsref implemented');
end
case 'char'
switch varargin{1}
case {'graph','milp'}
X = varargin{3};
Y = varargin{2};
if length(varargin{4}.subs) == 1
i = varargin{4}.subs{1};
M = length(X);
m = 1;
F = set(integer(i)); % just to be sure
d = binvar(length(X),1);
[Mx,mx]=derivebounds(X);
for j = m:M
di = d(j);
% F = F + set(mx*(1-di) <= Y-X(j) <= Mx*(1-di));
F = F + set(-(max(Mx)-min(mx))*(1-di) <= Y-X(j) <= (max(Mx)-min(mx))*(1-di));
F = F + set(-(1+M-m)*(1-di) <= i-j <= (1+M-m)*(1-di));
end
F = F + set(sum(d)==1);
else
i1 = varargin{4}.subs{1};
i2 = varargin{4}.subs{2};
M1 = size(X,1);
M2 = size(X,2);
m1 = 1;
m2 = 1;
if isa(i1,'sdpvar')
F = set(integer(i1)); % just to be sure
end
if isa(i2,'sdpvar')
F = set(integer(i2)); % just to be sure
end
d = binvar(size(X,1),size(X,2),'full');
[Mx,mx]=derivebounds(X);
for i = m1:M1
for j = m2:M2
di = d(i,j);
F = F + set(-(max(Mx)-min(mx))*(1-di) <= Y-X(i,j) <= (max(Mx)-min(mx))*(1-di));
if isa(i1,'sdpvar')
F = F + set(-(1+M1-m1)*(1-di) <= i1-i <= (1+M1-m1)*(1-di));
end
if isa(i2,'sdpvar')
F = F + set(-(1+M2-m2)*(1-di) <= i2-j <= (1+M2-m2)*(1-di));
end
end
end
F = F + set(sum(sum(d))==1);
end
varargout{1} = F;
varargout{2} = struct('convexity','none','monotonicity','none','definiteness','none');
varargout{3} = [X(:);i(:)];
otherwise
error('SDPVAR/ABS called with CHAR argument?');
end
otherwise
error('Strange type on first argument in SDPVAR/ABS');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -