From 8ca30867e869231f85848dc14e15f11e6d9c732b Mon Sep 17 00:00:00 2001
From: Michael Orlitzky
Date: Mon, 25 Feb 2013 10:09:03 -0500
Subject: [PATCH] Add envelope() and its tests.
---
envelope.m | 38 ++++++++++++++++++++++++++++++++++++++
tests/envelope_tests.m | 11 +++++++++++
2 files changed, 49 insertions(+)
create mode 100644 envelope.m
create mode 100644 tests/envelope_tests.m
diff --git a/envelope.m b/envelope.m
new file mode 100644
index 0000000..e54f818
--- /dev/null
+++ b/envelope.m
@@ -0,0 +1,38 @@
+function envelope = envelope(A)
+ ## Compute the envelope of the matrix ``A``. The envelope of a matrix
+ ## is defined as the set of indices,
+ ##
+ ## E = { (i,j) : i < j, A(k,j) != 0 for some k <= i }
+ ##
+ if (!issymmetric(A) && !is_upper_triangular(A))
+ ## The envelope of a matrix is only defined for U-T or symmetric
+ ## matrices.
+ envelope = {NA};
+ return;
+ end
+
+ ## Start with an empty result, and append to it as we find
+ ## satisfactory indices.
+ envelope = {};
+
+ for j = [ 1 : columns(A) ]
+ ## Everything below the first non-zero element in a column will be
+ ## part of the envelope. Since we're moving from top to bottom, we
+ ## can simply set a flag indicating that we've found the first
+ ## non-zero element. Thereafter, everything we encounter should be
+ ## added to the envelope.
+ found_nonzero = false;
+
+ for i = [ 1 : j-1 ]
+ if (A(i,j) != 0)
+ found_nonzero = true;
+ end
+
+ if (found_nonzero)
+ envelope{end+1} = [i,j];
+ end
+ end
+
+ end
+
+end
diff --git a/tests/envelope_tests.m b/tests/envelope_tests.m
new file mode 100644
index 0000000..88f5b4f
--- /dev/null
+++ b/tests/envelope_tests.m
@@ -0,0 +1,11 @@
+A = [2, 1, 1, 0; ...
+ 1, 2, 0, 1; ...
+ 1, 0, 2, 0; ...
+ 0, 1, 0, 1];
+
+expected = { [1,2], [1,3], [2,3], [2,4], [3,4] };
+actual = envelope(A);
+
+unit_test_equals("envelope works on an example", ...
+ true, ...
+ isequal(actual, expected));
--
2.33.1