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
diff -r f7629720f1b7 -r 0a881a3dc9a9 minors.m
--- /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
+
diff -r f7629720f1b7 -r 0a881a3dc9a9 minorsSym.m
--- 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
-
diff -r f7629720f1b7 -r 0a881a3dc9a9 semiDefIneq.m
--- /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