]> gitweb.michael.orlitzky.com - octave.git/blobdiff - envelope.m
Add envelope() and its tests.
[octave.git] / envelope.m
diff --git a/envelope.m b/envelope.m
new file mode 100644 (file)
index 0000000..e54f818
--- /dev/null
@@ -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