]> gitweb.michael.orlitzky.com - dunshire.git/blobdiff - matrices.py
Add doctests for the matrices module and fix its pylint warnings.
[dunshire.git] / matrices.py
index 01ab35274ed2157cac71af13dd84b0fdf3e4dfd4..a33259e6f3e71f7a4b5f2d47234464d80a9a3199 100644 (file)
@@ -1,34 +1,84 @@
-from cvxopt import matrix, spmatrix
+"""
+Utility functions for working with CVXOPT matrices (instances of the
+``cvxopt.base.matrix`` class).
+"""
 
-def append_col(A,b):
-    """
-    Append the column ``b`` to the right side of the matrix ``A``.
+from math import sqrt
+from cvxopt import matrix
+
+def append_col(left, right):
     """
-    return matrix([A.trans(),b.trans()]).trans()
+    Append the matrix ``right`` to the right side of the matrix ``left``.
+
+    EXAMPLES:
+
+        >>> A = matrix([1,2,3,4], (2,2))
+        >>> B = matrix([5,6,7,8,9,10], (2,3))
+        >>> print(append_col(A,B))
+        [  1   3   5   7   9]
+        [  2   4   6   8  10]
+        <BLANKLINE>
 
-def append_cols(cols):
     """
-    Append a bunch of columns together, left to right.
+    return matrix([left.trans(), right.trans()]).trans()
+
+def append_row(top, bottom):
     """
-    if len(cols) == 0:
-        return cols
+    Append the matrix ``bottom`` to the bottom of the matrix ``top``.
 
-    result = cols[0]
-    del(cols[0])
-    for column in cols:
-        result = append_col(result, column)
+    EXAMPLES:
 
-    return result
+        >>> A = matrix([1,2,3,4], (2,2))
+        >>> B = matrix([5,6,7,8,9,10], (3,2))
+        >>> print(append_row(A,B))
+        [  1   3]
+        [  2   4]
+        [  5   8]
+        [  6   9]
+        [  7  10]
+        <BLANKLINE>
 
+    """
+    return matrix([top, bottom])
 
-def append_row(A,b):
+def identity(domain_dim):
     """
-    Append the row ``b`` to the bottom of the matrix ``A``.
+    Return a ``domain_dim``-by-``domain_dim`` dense integer identity
+    matrix.
+
+    EXAMPLES:
+
+       >>> print(identity(3))
+       [ 1  0  0]
+       [ 0  1  0]
+       [ 0  0  1]
+       <BLANKLINE>
+
     """
-    return matrix([A,b])
+    if domain_dim <= 0:
+        raise ValueError('domain dimension must be positive')
+
+    entries = [int(i == j)
+               for i in range(domain_dim)
+               for j in range(domain_dim)]
+    return matrix(entries, (domain_dim, domain_dim))
 
-def identity(n):
+
+def norm(matrix_or_vector):
     """
-    Return the ``n``-by-``n`` identity matrix.
+    Return the Frobenius norm of ``matrix_or_vector``, which is the same
+    thing as its Euclidean norm when it's a vector (when one of its
+    dimensions is unity).
+
+    EXAMPLES:
+
+        >>> v = matrix([1,1])
+        >>> print('{:.5f}'.format(norm(v)))
+        1.41421
+
+        >>> A = matrix([1,1,1,1], (2,2))
+        >>> norm(A)
+        2.0
+
     """
-    return spmatrix(1,range(n),range(n))
+    return sqrt(sum([x**2 for x in matrix_or_vector]))