Add rank_k_approximation() and its tests.
authorMichael Orlitzky <michael@orlitzky.com>
Sat, 4 May 2013 01:51:30 +0000 (21:51 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Sat, 4 May 2013 01:51:30 +0000 (21:51 -0400)
rank_k_approximation.m [new file with mode: 0644]
tests/rank_k_approximation_tests.m [new file with mode: 0644]

diff --git a/rank_k_approximation.m b/rank_k_approximation.m
new file mode 100644 (file)
index 0000000..ff42f58
--- /dev/null
@@ -0,0 +1,19 @@
+function Ak = rank_k_approximation(A,k)
+  %
+  % Compute the rank-k approximation to A from the ``k`` largest
+  % singular values of A.
+  %
+  % INPUT:
+  %
+  %   - ``A`` -- The matrix to approximate.
+  %
+  %   - ``k`` -- The rank of the resulting matrix; i.e. the number
+  %              of (large) singular values to keep.
+  %
+  % OUTPUT:
+  %
+  %   - ``Ak`` -- The rank-k approximation to ``A``.
+  %
+  [U, S, V] = svds(A, k);
+  Ak = U*S*V';
+end
diff --git a/tests/rank_k_approximation_tests.m b/tests/rank_k_approximation_tests.m
new file mode 100644 (file)
index 0000000..8288752
--- /dev/null
@@ -0,0 +1,20 @@
+U = [4/5, 3/5, 0  ; ...
+     0  , 4/5, 3/5; ...
+     3/5, 0  , 4/5 ];
+
+S = [ 1, 0, 0;
+      0, 2, 0;
+      0, 0, 3 ];
+
+V = [ 0, 1, 0;
+      1, 0, 0;
+      0, 0, 1 ];
+
+A = U*S*V';
+
+expected = A;
+actual = rank_k_approximation(A, 3);
+
+unit_test_equals("Full rank approximation of a matrix is itself", ...
+                expected, ...
+                actual);