Mercurial > repos > public > sbplib
changeset 129:0a881a3dc9a9
Cleaned up the code for minors.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Wed, 03 Feb 2016 17:41:46 +0100 |
parents | f7629720f1b7 |
children | 9797a74a94ec |
files | minors.m minorsSym.m semiDefIneq.m |
diffstat | 3 files changed, 44 insertions(+), 53 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/minors.m Wed Feb 03 17:41:46 2016 +0100 @@ -0,0 +1,31 @@ +function [minor, sub] = minors(A) + [n, m] = size(A); + + if n ~= m + error('A must be square'); + end + + sub = {}; + ks = {}; + + ind = 1:n; + for k = 1:n + C = nchoosek(ind,k); + for i = 1:size(C,1) + ks{end + 1} = k; + sub{end + 1} = A(C(i,:),C(i,:)); + end + end + + for i = 1:length(sub) + fprintf('%d:\n', ks{i}); + disp(sub{i}) + + minor(i) = det(sub{i}); + end +end + + +% A is positive semidefinite if all minors are non-negative +% A is negative semidefinite if all odd minors are non-positive and all even minors are non-negative +
--- a/minorsSym.m Wed Feb 03 17:41:19 2016 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -function ineq = minorsSym(B) - B - - [n, m] = size(B); - - if n ~= m - error('B must be square'); - end - - subB = {}; - ks = {}; - - ind = 1:n; - for k = 1:n - C = nchoosek(ind,k); - for i = 1:size(C,1) - ks{end + 1} = k; - subB{end + 1} = B(C(i,:),C(i,:)); - end - end - - - - for i = 1:length(subB) - fprintf('%d:\n', ks{i}); - disp(subB{i}) - - minor{i} = det(subB{i}); - end - - for i = 1:length(subB) - fprintf('%d:\n', ks{i}); - disp(minor{i}); - - if mod(ks{i},2) == 0 - ineq{i} = minor{i} >= 0; - else - ineq{i} = minor{i} <= 0; - end - end - - ineqsys = true; - for i = 1:length(ineq) - ineqsys = ineqsys & ineq{i}; - end - - ineq = simplify(ineqsys) -end - - -% B is positive semidefinite if all minors are non-negative -% B is negative semidefinite if all odd minors are non-positive and all even minors are non-negative -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/semiDefIneq.m Wed Feb 03 17:41:46 2016 +0100 @@ -0,0 +1,13 @@ +function ineq = semiDefIneq(A) + [m, sub] = minors(A); + + ineqsys = true; + for i = 1:length(m) + ineqsys = ineqsys & m(i) >= 0; + end + + ineq = simplify(ineqsys); + + str = toString(ineq); + fprintf('%s\n',strjoin(strsplit(str,' & '), '\n')); +end \ No newline at end of file