1 | function F = nnz_internal(z,x,direction) |
---|
2 | |
---|
3 | switch direction |
---|
4 | case 0 |
---|
5 | [nx,mx] = size(x); |
---|
6 | if issymmetric(x) |
---|
7 | d = binvar(nx,nx); % d == 1 means x(i,j) can be non-zero |
---|
8 | else |
---|
9 | d = binvar(nx,mx,'full'); |
---|
10 | end |
---|
11 | x = reshape(x,nx*mx,1); |
---|
12 | d = reshape(d,nx*mx,1); |
---|
13 | [M,m] = derivebounds(x); |
---|
14 | F = set(m.*d <= x <= M.*d) + set(z == sum(sum(d))); |
---|
15 | F = F + set(0 <=z <= nx*mx); |
---|
16 | |
---|
17 | case 1 |
---|
18 | [nx,mx] = size(x); |
---|
19 | if issymmetric(x) |
---|
20 | du = binvar(nx,nx); % du == 1 means x(i,j) > 0 |
---|
21 | dd = binvar(nx,nx); % dd == 1 means x(i,j) < 0 |
---|
22 | else |
---|
23 | du = binvar(nx,mx,'full'); |
---|
24 | dd = binvar(nx,mx,'full'); |
---|
25 | end |
---|
26 | x = reshape(x,nx*mx,1); |
---|
27 | du = reshape(du,nx*mx,1); |
---|
28 | dd = reshape(dd,nx*mx,1); |
---|
29 | [M,m] = derivebounds(x); |
---|
30 | F = set(m.*(du+dd) <= x <= M.*(du+dd)) + set(sum([du dd],2) <= 1); |
---|
31 | F = F + set(z == ((sum(du) + sum(dd)))); |
---|
32 | F = F + set(x > 1+(-1+m).*(1-du)); |
---|
33 | F = F + set(x < -1+(1+M).*(1-dd)); |
---|
34 | F = F + set(0 <= z <=nx*mx); |
---|
35 | otherwise |
---|
36 | end |
---|
37 | |
---|