Add random_positive_definite_matrix() and its tests.
authorMichael Orlitzky <michael@orlitzky.com>
Fri, 22 Mar 2013 05:48:19 +0000 (01:48 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Fri, 22 Mar 2013 05:48:19 +0000 (01:48 -0400)
random_positive_definite_matrix.m [new file with mode: 0644]
tests/random_positive_definite_matrix_tests.m [new file with mode: 0644]

diff --git a/random_positive_definite_matrix.m b/random_positive_definite_matrix.m
new file mode 100644 (file)
index 0000000..fb3be2c
--- /dev/null
@@ -0,0 +1,24 @@
+function A = random_positive_definite_matrix(integerN)
+  %
+  % Generate a random, symmetric positive-definite (SPD) matrix.
+  %
+  % Since all (SPD) matrices are diagonalizable and have positive
+  % eigenvalues, it seems likely that we can generate an SPD matrix by
+  % combining random orthogonal matrices with a diagonal matrix of
+  % random eigenvalues.
+  %
+  % I have no proof/evidence that this approach is sound.
+  %
+  % INPUT:
+  %
+  %   - ``integerN`` -- The dimension of the resulting matrix.
+  %
+  % OUTPUT:
+  %
+  %   - ``A`` -- A symmetric, positive definite matrix.
+  %
+  U = random_orthogonal_matrix(integerN);
+  d = unifrnd(eps, realmax, 1, integerN);
+  D = diag(d);
+  A = U*D*U';
+end
diff --git a/tests/random_positive_definite_matrix_tests.m b/tests/random_positive_definite_matrix_tests.m
new file mode 100644 (file)
index 0000000..01afb4c
--- /dev/null
@@ -0,0 +1,9 @@
+for n = [ 5, 10, 25, 50, 100 ]
+  A = random_positive_definite_matrix(n);
+  [R, P] = chol(A);
+
+  # chol() will set P=0 if A was symmetric positive-definite.
+  expected = 0;
+  msg = sprintf('random_positive_definite_matrix(%d) has a chol()', n);
+  unit_test_equals(msg, expected, P);
+end