nnz_internal.m
来自「optimization toolbox」· M 代码 · 共 38 行
M
38 行
function F = nnz_internal(z,x,direction)
switch direction
case 0
[nx,mx] = size(x);
if issymmetric(x)
d = binvar(nx,nx); % d == 1 means x(i,j) can be non-zero
else
d = binvar(nx,mx,'full');
end
x = reshape(x,nx*mx,1);
d = reshape(d,nx*mx,1);
[M,m] = derivebounds(x);
F = set(m.*d <= x <= M.*d) + set(z == sum(sum(d)));
F = F + set(0 <=z <= nx*mx);
case 1
[nx,mx] = size(x);
if issymmetric(x)
du = binvar(nx,nx); % du == 1 means x(i,j) > 0
dd = binvar(nx,nx); % dd == 1 means x(i,j) < 0
else
du = binvar(nx,mx,'full');
dd = binvar(nx,mx,'full');
end
x = reshape(x,nx*mx,1);
du = reshape(du,nx*mx,1);
dd = reshape(dd,nx*mx,1);
[M,m] = derivebounds(x);
F = set(m.*(du+dd) <= x <= M.*(du+dd)) + set(sum([du dd],2) <= 1);
F = F + set(z == ((sum(du) + sum(dd))));
F = F + set(x > 1+(-1+m).*(1-du));
F = F + set(x < -1+(1+M).*(1-dd));
F = F + set(0 <= z <=nx*mx);
otherwise
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?